循环内的JavaScript闭包 - 一个简单实用的例子
var funcs = [];
for (var i = 0; i < 3; i++) { // let's create 3 functions
funcs[i] = function() { // and store them in funcs
console.log("My value: " + i); // each should log its value.
};
}
for (var j = 0; j < 3; j++) {
funcs[j](); // and now let's run each one to see
}
那么,问题在于,在你的每个匿名函数中,变量i
被绑定到该函数之外的同一个变量。
你想要做的就是将每个函数中的变量绑定到函数之外的单独的,不变的值:
var funcs = [];
function createfunc(i) {
return function() { console.log("My value: " + i); };
}
for (var i = 0; i < 3; i++) {
funcs[i] = createfunc(i);
}
for (var j = 0; j < 3; j++) {
funcs[j](); // and now let's run each one to see
}
尝试:
var funcs = [];
for (var i = 0; i < 3; i++) {
funcs[i] = (function(index) {
return function() {
console.log("My value: " + index);
};
}(i));
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
编辑 (2014):
我个人认为@澳大利亚最近对使用.bind
回答是现在做这种事情的最好方法。 当你不需要或不想混乱bind
的_.partial
时,还有lo-dash /下划线的thisArg
。
还没有提到的另一种方式是使用Function.prototype.bind
var funcs = {};
for (var i = 0; i < 3; i++) {
funcs[i] = function(x) {
console.log('My value: ' + x);
}.bind(this, i);
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
链接地址: http://www.djcxy.com/p/153.html
上一篇: JavaScript closure inside loops – simple practical example