立即执行函数
- 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’) }();//报错函数声明加括号肯定会报错。
- 表达式才能被执行符号执行。
- 只要把函数声明成表达式。函数名就没有必要了。
- 立即执行函数执行完毕之后会被立即销毁。这个时候函数名就没有必要了。
```javascript
function 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>
## ()表达式
```javascript
var 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的AO
arr[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
}
// 返回出去的时候形成闭包。
}