1、函数定义与调用
<script>// es5函数定义function add(x, y) {return x + y;}// 函数调用console.log(add(10, 20));//es6箭头函数定义let add1 = (x,y) => x+y;let add2 = (x,y) => {let z = 10;return x+y+z;}let classResult = (x,y) =>{let z = 10;return ({x,y,z});}// 函数调用console.log(add1(1,2));console.log(add2(1,2));console.log(classResult(1,2));</script>
<script>function add(){};let add1 = () => {}let name = "azhi";let user = {//属性名和属性值是同样的可以省略name,age: 18,getUsername: function () {console.log("es5写法");},getUsername1() {console.log("es6写法,在大括号里的函数可以简化省略: function");},}console.log(user.name);</script>
2、JavaScript 全局函数
| 函数 | 描述 |
|---|---|
| decodeURI() | 解码某个编码的 URI。 |
| decodeURIComponent() | 解码一个编码的 URI 组件。 |
| encodeURI() | 把字符串编码为 URI。 |
| encodeURIComponent() | 把字符串编码为 URI 组件。 |
| escape() | 对字符串进行编码。 |
| eval() | 计算 JavaScript 字符串,并把它作为脚本代码来执行。 |
| isFinite() | 检查某个值是否为有穷大的数。 |
| isNaN() | 检查某个值是否是数字。 |
| Number() | 把对象的值转换为数字。 |
| parseFloat() | 解析一个字符串并返回一个浮点数。 |
| parseInt() | 解析一个字符串并返回一个整数。 |
| String() | 把对象的值转换为字符串。 |
| unescape() | 对由 escape() 编码的字符串进行解码。 |
3、js闭包
优点:
①封装功能
②防止全局变量污染
③ 延长变量的生命周期,缓存上一次执行的结果
④实现局部变量/函数私有化
缺点:
①浪费内存(尤其是引用了较大的对象)
注意事项:
①因为调用函数会创建闭包,所以要避免嵌套调用/递归调用闭包函数
示例代码1:
下面我们看一下计算总数的这个代码,我们定义了一个全局的变量sum,用于存储累计的结果,如下:
<body><script>var sum = 0;function add(a){sum += a;};add(1);add(2);add(3);console.log(sum); //sum : 6</script></body>
示例代码2:
上面这样写是可以实现我们想要的效果的,但sum是全局的变量,程序随时可以改变值,这样的设计不够完善,我们有没办法在add函数中定义一个参数来存储累计的结果值呢?答案是可以的,我们可以再看下面的闭包代码:
<body><script>var add = (function(){var sum = 0;return function(a){return sum += a;}})();add(1);add(2);console.log(add(3)); //result : 6</script></body>
示例代码3:
关于闭包,我们知道它的缺点是有内存泄露问题,我们看下下面的闭包代码:
<body><button id="btn">增加</button><script>var add = (function(a){var array = [];return function(){return array.push(a);}})();var aCount = 0;var btn = document.getElementById("btn");btn.onclick = function(){for(var i=0;i<10000000;i++){aCount++;add("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");}console.log(aCount);};</script></body>
js初始堆内存:
点击了几次增加按钮之后的js堆内存:
此时会发现堆内存长时间占用着没有释放。我们对上面的代码改造一下便可以实现堆内存释放了。
<body><button id="btn">增加</button><script>function fn1(a){var array = [];return function(){return array.push(a);}};var aCount = 0;var btn = document.getElementById("btn");btn.onclick = function(){var add = fn1();for(var i=0;i<10000000;i++){aCount++;add("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");}console.log(aCount);add = null;};</script></body>
此时堆内存在一分钟内便会释放掉:
狂点增加按钮的话堆内存释放的时间就长点:
