1.匿名函数
通过自我执行来执行匿名函数
1 (function(){...})() // 前面小括号是匿名函数,后面小括号是执行
函数里面放一个匿名函数
1 function box(){ 2 return function(){ 3 return ‘haha‘; 4 } 5 } 6 var b = box(); 7 alert(b())
// alert(box()()) 不建议这么写
闭包
定义:有权访问另一个函数作用域中的变量的函数(在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量)
1. 使用匿名函数实现局部变量驻留内存中从而累加
1 function box(){ 2 var age = 100; 3 return function(){ 4 age++; 5 return age; 6 } 7 } 8 var b = box(); 9 aler(b()); 10 aler(b()); 11 aler(b()); 12 aler(b());
b = null // 解除引用,等待垃圾回收
ps:由于闭包作用域返回的局部变量资源不会被立刻销毁回收,所以可能会占用更多的内存。过度使用闭包会导致性能下降,建议在非常必要的时候使用闭包
2.
1 function box(){ 2 var arr = []; 3 for(var i = 0; i < 5; i++){ 4 arr[i] = (function(num){ 5 return function(){ 6 return num; 7 } 8 })(i); // 及时执行自己 9 } 10 return arr; 11 } 12 var b = box(); 13 for(var i = 0; i < 5; i++){ 14 alert(b[i]( )); 15 }
3.关于this对象(闭包不属于object,this指向window)
1 var user = ‘window‘ 2 var box = { 3 user: ‘box‘, 4 getUser: function(){ 5 var that = this; 6 return function(){ 7 // return this; 8 return that.user; 9 } 10 } 11 } 12 // alert(box.getUser()()); // 指向window对象 13 // alert(box.getUser().call(box)); // call,通过对象冒充指向box 14 alert(box.getUser()())