循环内的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

下一篇: What is a practical use for a closure in JavaScript?