functioncount(){var arr =[];for(var i =1; i <=3; i++){
arr.push(function(){return i * i;});}return arr;}var result =count();var f1 = result[0];var f2 = result[1];var f3 = result[2];// 调用f系列函数f1();// 16f2();// 16f3();// 16
原因在于引用了变量i,并没有立刻执行,而是等三个函数都返回的时候,i都变为4才执行
闭包返回牢记:返回函数不要引用任何循环变量,或者后续会发生变化的变量
若一定要引用循环变量,可以再创建一个函数,用该函数的参数绑定循环变量当前的值
functioncount(){var arr =[];for(var i =1; i <=3; i++){
arr.push((function(n){returnfunction(){return n * n;})(i);}}}// 这里创建一个匿名函数并立即执行的语法(function(x){return x * x;})(3);// 9// 理论上讲,匿名函数可以这么写function(x){return x * x }(3);// js引擎会把{开头的语句当作块处理// js语法解析的问题,会报SyntaxError错误,因此要括起来整个定义
(function(x){return x * x })(3);
借助函数的闭包,可以封装一个私有变量
function create_counter(initial) {
var x = initial || 0;
return {
inc: function() {
x += 1;
return x;
}
}
}
// like this
var c1 = create_counter();
c1.inc(); // 1
c1.inc(); // 2
c1.inc(); // 3
var c2 = create_counter(10);
c2.inc(); // 11
c2.inc(); // 12
c2.inc(); // 13