正文
console.log(a+b);
}
plusFn(3,4);//7
关于我对闭包的用途的理解 。
1.面向对象。
如果说现在现在有很多个玩家进游戏选角色的时候要捏人,如果从过程上去处理,那无疑是不够灵活的。
如果从对象上处理呢?
①.便于复用:
捏头(头部属性);捏身子(身子属性);捏手(手部属性);捏腿(腿部属性);
这样的话,只要写四个方法,就可以拼接成一个捏人的方法。而且可以重复使用这套方法,构成结构的多样性。
②.便于代码维护:
如果想要在身上捏对翅膀的话,完全可以再多加一个捏翅膀(翅膀属性);
2.异步处理。
因为闭包使用的是参数,而不闭包使用的是变量,之前解释过,参数为函数内部的常量,这个值在调用闭包的时候已经设置好,不会随着外界变量的改变而改变。
还有个是个人的习惯问题,我更喜欢的是写好一个方法,然后到处使用,尤其是ajax的时候,得到参数的处理方法,success的时候 fun(返回值),error的时候 fun(默认值),而且由于js的单线程多进程,频繁切换进程但同一进程却是按照顺序执行,这样的话,将方法闭包放入一个进程里面可以既方便又有效地避免异步引发的bug。
3.方便回调
从前有座山,山上有座庙,瞄里有个老和尚,老和尚给小和尚讲故事:。。。
这就是无限循环就是个回调函数。
(function test(){
console.log('从前有座山,山上有座庙,瞄里有个老和尚,老和尚给小和尚讲故事:');
test();
})();
闭包题的分析:
这里从网上找了俩道比较经典的面试题,因为我实在也不知道它们初始出处是哪里,原谅我没法写引用地址。
1.
for(var i = 1; i <= 5; i++) {
setTimeout( function () {
console.log(i);
}, 1000 );
} //5 5 5 5 5
改写一下:
function test(t){
setTimeout( function () {
console.log(t);
}, 1000 );
}
for(var i = 1; i <= 5; i++) {
test(i);
} //1,2,3,4,5
这个就是异步的问题,如果使用闭包,闭包被调用的时候,console.log()分配的参数则是1,2,3,4,5这五个常量。而不闭包,则是瞬间去给五个console.log()分配了变量i,而i在内存中是一个变量,在setTimeout设定的时间到达时,已经是5了,这也是为什么一下子输出5个5的原因。