Javascript:循环闭合?
我想做以下事情:
for (var i = 0; i < 10; ++i) {
createButton(x, y, function() { alert("button " + i + " pressed"); }
}
问题是我总是得到 i
的最终值,因为 Javascript 的闭包不是按值计算的。
那么我怎样才能用javascript做到这一点呢?
I would like to do the something along the following:
for (var i = 0; i < 10; ++i) {
createButton(x, y, function() { alert("button " + i + " pressed"); }
}
The problem with this is that I always get the final value of i
because Javascript's closure is not by-value.
So how can I do this with javascript?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
如果您正在为使用 JavaScript 1.7 或更高版本的浏览器进行编码,一种解决方案是使用
let
关键字:来自 MDC 文档中心:
查看MDC 文档中心了解传统方法(创建另一个闭包)。
One solution, if you're coding for a browser that uses JavaScript 1.7 or higher, is to use the
let
keyword:From the MDC Doc Center:
Check out the MDC Doc Center for the traditional approach (creating another closure).
请注意,JSLint 不喜欢这种模式。它抛出“不要在循环内创建函数”。
现场演示: http://jsfiddle.net/simevidas/ZKeXX/
Note that JSLint doesn't like this pattern. It throws "Don't make functions within a loop.".
Live demo: http://jsfiddle.net/simevidas/ZKeXX/
通过执行另一个函数为闭包创建一个新范围:
http://www.mennovanslooten.nl/blog /post/62
Create a new scope for the closure by executing another function:
http://www.mennovanslooten.nl/blog/post/62
您需要将闭包放入单独的函数中。
此代码创建一个匿名函数,该函数将
i
作为循环每次迭代的参数。由于这个匿名函数每次迭代都有一个单独的 i 参数,因此它解决了这个问题。
这相当于
You need to put the closure into a separate function.
Thise code creates an anonymous function that takes
i
as a parameter for each iteration of the loop.Since this anonymous function has a separate
i
parameter for each iteration, it fixes the problem.This is equivalent to
外部的匿名函数会自动调用,并在其作用域内创建一个带有
n
的新闭包,其中采用i
的当前值每次调用它时。The anonymous function on the outside is automatically invoked and creates a new closure with
n
in its scope, where that takes the then current value ofi
each time it's invoked.