如何使用局部参数创建匿名函数

发布于 12-01 10:25 字数 241 浏览 1 评论 0原文

如何使这个 javascript 警报为 0、1 和 2,而不是 3 3?

var vals = [1, 2, 3];
for(var i = 0; i < vals.length; i++)
{
    window.setTimeout(function() {alert(i);}, 1000);
}

我知道它这样做的原因,但我不知道如何将 i 传递给匿名函数。

How do I make this javascript alert 0, 1 and 2 instead of 3 3's?

var vals = [1, 2, 3];
for(var i = 0; i < vals.length; i++)
{
    window.setTimeout(function() {alert(i);}, 1000);
}

I know the reason why it does this, but I can't figure out, how to pass i to the anonymous function.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

你曾走过我的故事2024-12-08 10:25:14

您可以将其包装在一个闭包中,如下所示:

var vals = [1, 2, 3];

for(var i = 0; i < vals.length; i++) {
    (function(num) {
        window.setTimeout(function() {alert(vals[num]);}, 1000);
     })(i);
}

尝试一下: http://jsfiddle.net/qgL7h/

You can wrap this in a closure like so:

var vals = [1, 2, 3];

for(var i = 0; i < vals.length; i++) {
    (function(num) {
        window.setTimeout(function() {alert(vals[num]);}, 1000);
     })(i);
}

Try it: http://jsfiddle.net/qgL7h/

﹉夏雨初晴づ2024-12-08 10:25:14
var vals = [1, 2, 3];
function makeCallback(i)
{
    return function () {alert(i);};
}
for(var i = 0; i < vals.length; i++)
{
    window.setTimeout(makeCallback(i), 1000);
}
var vals = [1, 2, 3];
function makeCallback(i)
{
    return function () {alert(i);};
}
for(var i = 0; i < vals.length; i++)
{
    window.setTimeout(makeCallback(i), 1000);
}
紫罗兰の梦幻2024-12-08 10:25:14

传递 i 给函数并不是绝对必要的,它可以分配给内部的局部变量。

var vals = [1, 2, 3];

for(var i = 0; i < vals.length; i++) {
    (function() {
        var num = i
        window.setTimeout(function() {alert(vals[num]);}, 1000);
     })();
}

“function(){block}()”是必需的,因为 Javascript 没有适当的块词法变量。最近的版本添加了“let”,这使得这成为可能:

var vals = [1, 2, 3];

for(var i = 0; i < vals.length; i++) {
    let num = i
    window.setTimeout(function() {alert(vals[num]);}, 1000);
}

It is not strictly necessary to pass i to the function, it can be assigned to a local var inside.

var vals = [1, 2, 3];

for(var i = 0; i < vals.length; i++) {
    (function() {
        var num = i
        window.setTimeout(function() {alert(vals[num]);}, 1000);
     })();
}

The "function(){block}()" was required, because Javascript didn't have proper block lexical variables. Recent editions have added "let", which makes this possible:

var vals = [1, 2, 3];

for(var i = 0; i < vals.length; i++) {
    let num = i
    window.setTimeout(function() {alert(vals[num]);}, 1000);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文