刚刚学习js,发现闭包不太好理解,稍不留神就出错,总结下今天学的内容。
以代码为例,看的清楚:
<pre name="code" class="javascript">var cc = {name : 'cc'};
function KeepVal(val){
return function(){
return val;
};
}
//保持变量
var KV = KeepVal(cc);
cc = 10;
console.log(cc.name);
console.log(KV());
var obj1 = {}
var notobj = 2;
var obj2 = {
obj1,
notobj : notobj
};
console.log(obj2);
function CSum(){
var sm = 0;
return function(val){
sm += val;
return sm;
}
}
//持有状态
var cs1 = CSum();
console.log(cs1(1));
console.log(cs1(2));
console.log(cs1(3));
var cs2 = CSum();
console.log(cs2(5));
console.log(cs2(2));
console.log(cs2(3));
console.log(cs1(0));
//for循环中容易用错的闭包写法,从上面的两个例子里就可以明白为什么下面这个Array赋值要使用匿名函数了
function getifunc(val){
var arr = [];
arr.length = val;
for(var i = 1; i < val; ++i)
{
arr[i] = (function(v){
return function(){
return v;
};
})(i);
}
return arr;
}
var arr = getifunc(10);
console.log('array length : ' + arr.length);
//console.log(arr[5]());
arr.forEach(function(currentValue, index, arr){
console.log(currentValue());
});
var arr2 = [1, 2, 3];
var EvFunc = function(currentValue, index, arr){
console.log(currentValue);
};
arr2.forEach(EvFunc);