Javascript:关闭循环?

sho*_*osh 5 javascript closures anonymous-function

我想做以下事情:

for (var i = 0; i < 10; ++i) {
    createButton(x, y, function() { alert("button " + i + " pressed"); }
}
Run Code Online (Sandbox Code Playgroud)

这个问题是我总是得到最终值,i因为Javascript的闭包不是按值.
那么我怎么能用javascript做到这一点?

McS*_*tch 7

如果您要编写使用JavaScript 1.7或更高版本的浏览器,则一种解决方案是使用let关键字:

for(var i = 0; i < 10; ++i) {
    let index = i;
    createButton(x, y, function() { alert("button " + index + " pressed"); }
}
Run Code Online (Sandbox Code Playgroud)

来自MDC Doc Center:

let关键字导致使用块级范围创建项变量,从而为for循环的每次迭代创建新的引用.这意味着为每个闭包捕获一个单独的变量,解决共享环境引起的问题.

查看MDC Doc Center以了解传统方法(创建另一个闭包).


Šim*_*das 6

for(var i = 0; i < 10; i++) {
    (function(i) {
        createButton(function() { alert("button " + i + " pressed"); });
    })(i);
}
Run Code Online (Sandbox Code Playgroud)

请注意,JSLint不喜欢这种模式.它抛出"不要在循环中创建函数".

现场演示: http ://jsfiddle.net/simevidas/ZKeXX/