1.说到闭包大家可能会说函数套函数,延长作用域链。对没错,确实是这样的,但是你对他的理解是多少呢,函数闭包可以说的有很多,夸张的说,说个半天是绝对没问题的,它的用处非常多,作用也非常多,这个需要你多想想的,不多说,下面我们来看代码。
function A(){
var x = 1;
return function(){
x++;
console.log(x);
}
}
var m1 = A();
m1();//2
m1();//3
var m2 = A();
m2();//2
m1();//4
刚开始一直不明白为什么m1执行两次x的值会累加。我这属于没有明白函数的执行环境及作用域链。
当m1第一次执行时A()会在内存中开辟一个环境,然后返回函数也会开辟一个执行环境也就是大圈里面有个小圈,
此时小圈里的x时从大圈里拿的,然后会打印2,第二次执行m1时,由于第一次执行m1延长作用域链,也就是大小圈依然存在而且里面的x=2,
此时大圈将x的值重新赋值为1,但是小圈里的x依旧是2,当执行到x++是,
会检测当前环境是否有x,答案是有此时x=2,执行x++时就是2++,打印出来就是3,
当将A()给了m2时又会开辟一个环境,这两个环境并不干扰,没有任何联系。
以上就是我对闭包的一点拙见,可能有不对的地方(全凭个人乱想),请大佬指正!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。