立即执行函数
- IIFE immediately invoked function expression
- 立即执行函数的几种方式
- (function(){}())
- (function(){})()
- +,-,!,||,&& 可以把函数变成表达式。
- (任何东西)都会把里面东西变成表达式。
```javascript var a = function(){//立即执行方法的几种形式//第一种(function(){}());//第二种(function(){})();//第三种+function(){}()-function(){}()!function(){}()0||function(){}()1&&function(){}();
}(); console.log(a);// undefined 可以执行。 //是什么把这个匿名函数变成表达式的。console.log(1);
function test(){ console.log(‘x’) }();//报错函数声明加括号肯定会报错。
- 表达式才能被执行符号执行。- 只要把函数声明成表达式。函数名就没有必要了。- 立即执行函数执行完毕之后会被立即销毁。这个时候函数名就没有必要了。```javascriptfunction test(a){console.log(a);}(6)//不报错、js 引擎会优先解析成(6)表达式、//相当于下面function test(a){console.log(a);}(6);//表达式
逗号运算符
- 返回逗号后面的内容 ```javascript var num = (2-1,5+5,10+9);//19
//面试题 var fn = ( function test1(){ return 1 }, function test2(){ return ‘2’ } )(); console.log(typeof(fn))//string, //解释:相当于执行,后的test2,相当于执行test2(); typeof(‘2’) string;
<a name="RXB7R"></a>## ()表达式```javascriptvar a = 10;if(function b(){}){a += typeof(b);}console.log(a);//10undefined//解释:(function b(){})是表达式、
闭包深入
//1:test 执行前一刻 生成了自己的AO ,接着test执行.function test(){//2:test的AO里面包含了arr,i.var arr = [];//3: 执行的时候 arr = []; i=0;for(var i = 0;i<10;i++){//5: 此时,function(){...}被定义的时候生成了自己的作用域和作用域链.且作用域链第0位是test的AOarr[i] = function(){document.write(i);}};return arr;}//6: test执行完毕。test与test的AO之间断线var myArr = test()//7:myArr 循环的时候,myArr[j]()执行的时候操作的i还是test AO里面的i;for(var j = 0;j<myArr.length;j++){myArr[j]();//10个10;}
//让这段代码输出0-9;function test(){var arr = [];for(var i = 0;i < 10;i ++){(function(j){arr[j] = function(){document.write(j);}}(i))//立即执行函数。将i当参数传入到闭包中去。};return arr;}var myArr = test()for(var j = 0;j<myArr.length;j++){myArr[j]();//0,1,2,3,4,5,6,7,8,9}//解释。在循环的时候添加一个立即执行函数,并且吧i当做参数传递给里面的函数。此时输出的i就不会变成10
demo
累加器
//count 被定义时 产生了作用域和作用域链 作用域第0位存储着GO//count.scope_chain ={// 0 : GO,// }function count(){//add 被定义的时候//add.scope.chain={// 0:count.AO,// 1:GO//}//add.AO ={// n:0,// add:function(){};// } }var n = 0;function add(){n++;console.log(n);}return add//add 被返回出去。add的作用域链里还存着count的AO.}var countNum = count();countNum();
缓存器
// cacheMemory 被定义的时候 产生了cacheMemory作用域和作用域链// cacheMemory.scope-chain = {// 0:GO// }function cacheMemory(){// addStudent 被定义的时候// addStudent.scope-chain{// 0:cacheMemory.AO// 1:GO// }var students = [];function addStudent(name){if(students.indexOf(name)>-1){return;}students.push(name);console.log(students);}// reduceStudent 被定义的时候// reduceStudent.scope-chain{// 0:cacheMemory.AO// 1:GO// }function reduceStudent(name){var index = students.indexOf(name);students.splice(index,1);console.log(students);}return{addStudent,reduceStudent}// 返回出去的时候形成闭包。}
