闭包陷阱
闭包我理解的简而言之就是一个函数内部有另一个函数,里面那个函数可以访问父级函数的变量,如果这个内部函数在父级函数外部被调用,就形成了闭包。
var a = (function () {
var num = 1;
function changeNum (a) {
num += a;
}
return {
plusFun: function () {
changeNum(1);
},
decreaseFun: function () {
changeNum(-1);
},
value: function () {
return num
}
}
})();
console.log(a.value()) // 0
a.plusFun();
console.log(a.value()) // 1
a.decreaseFun();
console.log(a.value()) // 0
闭包陷阱之 循环内套用
例子来源:https://www.cnblogs.com/ZinCode/p/5551907.html
function box(){
var arr = [];
for(var i=0;i<5;i++){
arr[i] = function(){
return i; //由于这个闭包的关系,他是循环完毕之后才返回,最终结果是4++是5
} //这个匿名函数里面根本没有i这个变量,所以匿名函数会从父级函数中去找i,
} //当找到这个i的时候,for循环已经循环完毕了,所以最终会返回5
return arr;
}
引用一句原文的解释:
在for循环里面的匿名函数执行 return i 语句的时候,由于匿名函数里面没有i这个变量,所以这个i他要从父级函数中寻找i,而父级函数中的i在for循环中,当找到这个i的时候,是for循环完毕的i,也就是5,所以这个box得到的是一个数组[5,5,5,5,5]。