1.立即执行函数 -> IIFE - immediately-invoked function expression -> 初始化函数
1.1 特点:
- 立即执行
- 执行完成后立即释放
1.2 写法:
```javascript /第一种写法 -> 使用较多/ (function(){ })(); /第二种写法 -> W3C建议/ (function(){ }());
<a name="udqAT"></a>### 1.3 小括号1. 括号可以将函数、值、变量转为表达式```javascript/*能否执行*//* -- 1 -- */function test(){console.log('能');}(); //不能执行/* -- 2 -- */var test = function test(){console.log('能');}(); //能执行/* -- 3 -- */(function test(){console.log('能');})() //能/*只有表达式才能被执行符号()执行*/
- !* || 能将函数声明转为表达式 ```javascript /报错 无法执行*/ function test(){ console.log(‘1’); }()
/可以执行/
- function test(){ console.log(‘1’); }()
/不报错,但函数内部也不执行/ function test(){ console.log(‘1’); }(6)
3. 面试题```javascript/*打印的是10个10,利用了闭包和test()的AO*/function test(){var arr = [];for(var i = 0; i< 10; i++){arr[i] = function(){document.write(i + ' ');}}return arr;}var myArr = test();for(var j = 0; j < 10; j++){myarr[j]();}/*打印1-10*/function test(){for(var i = 0; i< 10; i++){(function(){document.write((i + 1) ' ');})()//让函数立即执行}}test();/*第二种方法*/function test(){var arr = [];for(var i = 0; i< 10; i++){(function(){arr[j] = function(){document.write(j + ' ');}})(i);}return arr;}var myArr = test();for(var j = 0; j < 10; j++){myarr[j]();}
- 面试题 ```javascript / 点击0显示1 点击1显示2 点击2显示3 点击3显示4 点击4显示5 / var oLi = doucument.querySelectorAll(‘li’); for(var i = 0; i < oLi.length; i++){ oLi[i].onclick = function(){ console.log(i); } } //此时 点击任何一个数都显示5 解决办法如下: var oLi = doucument.querySelectorAll(‘li’); for(var i = 0; i < oLi.length; i++){ (function(j){ oLi[i].onclick = function(){ console.log(j); } })(i); }
/逗号运算符/ var fn = ( function test1(){ return 1; }, function test2(){ return 2; } )(); console.log(typeof(fn));
/括号 - 表达式/ var a = 10; if( function b(){} ){ a += typeof(b); } console.log(a);
4.作业```javascript/*累加器 闭包 执行一次加一次并答应 初始数字为0*/function accumulator() {var num = 0;var calculation = {add: function(){num++;console.log("num: " + num);},reduce: function(){num--;console.log("num:" + num);},};return calculation;}var cal = accumulator();cal.add();cal.add();cal.reduce();cal.reduce();/*缓存器 一个班级,学生名字保存在一个数组里,两个方法写在函数中的一个对象中,第一个方法加入班级,第二个方法离开班级,每次加入或离开都需要打印新的学生名单*/function myClass(){var arr = [];var opeations = {join: function(name){arr.push(name);console.log(arr);},leave: function(name){/*for(var i = 0; i < arr.length; i++){var item = arr[i];if(item === name){arr.splice(i, 1);}}*/var idx = arr.indexOf(name);if(idx !== -1){arr.splice(idx, 1);}console.log(arr);}};return opeations;}var work = myClass();work.join('张三');work.join('李四');work.join('王五');work.join('赵六');work.leave();work.leave();
