1

我怎样才能得到这个

var i = 0;
var codes = [1, 2, 3];

for (var i = 0; i < codes.length; ++i)
{
    setTimeout(function(){alert(codes[i]);},100);
}

alert 12并且3不使用let关键字?

或在元素上绑定事件(示例):

var i = 0;
var codes = [1, 2, 3];

for (var i = 0; i < codes.length; ++i)
{
    $("div").eq(i).click(function(){
        alert( codes[i] );
    });
}
4

5 回答 5

4

使用自执行匿名函数并i作为变量闭包的参数传入。

var i = 0;
var codes = [1, 2, 3];

for (var i = 0; i < codes.length; ++i)
{
    (function( index ) {
        setTimeout(function(){alert(codes[index]);},100);
    })(i);
}

这是一个例子。

于 2011-03-08T00:20:32.563 回答
3

您需要使用闭包。我通常创建一个“生成器”函数,该函数返回一个在所需上下文中定义的函数:

var i = 0;
var codes = [1, 2, 3];
function callbackGenerator(i) { 
   return function(){alert(codes[i]);}
}

for (var i = 0; i < codes.length; ++i)
{
    setTimeout(callbackGenerator(i), 100);
}

更多信息和好的例子在这里: https ://developer.mozilla.org/en/JavaScript/Guide/Closures

于 2011-03-08T00:23:38.907 回答
1
var i = 0;
var codes = [1, 2, 3];

var timeoutFunc = function() {
    alert(codes[i++]);
    if (i < codes.length) {
        setTimeout(timeoutFunc, 100);
    }
};

setTimeout(timeoutFunc, 100);
于 2011-03-08T00:13:56.947 回答
1

这应该这样做。

var codes = [1, 2, 3];

for (var i = 0; i < codes.length; ++i)
    setTimeout(function(code){return function(){
        alert(code);
    }}(codes[i]), 100);
于 2011-03-08T00:24:21.793 回答
1

使用自执行功能

for (var i = 0; i < codes.length; ++i) (function(bound_i) {
    setTimeout(function(){alert(codes[bound_i]);},100);
})(i);

可选地使用var语句以获得更详细的代码:

for (var i = 0; i < codes.length; ++i) (function() {
    var bound_i = i;
    setTimeout(function(){alert(codes[bound_i]);},100);
})();

或者,如果您愿意,可以使用命名函数:

function foo(i) {
    setTimeout(function(){alert(codes[i]);},100);
}

for (var i = 0; i < codes.length; ++i) {
    foo(i);
}

任何一个例子都形成了一个闭包,它引入了新的变量范围。或者,ES5 有可以在匿名函数上使用的 Function.bind,但它还没有在所有浏览器中得到普遍支持(我在考虑 IE。)

于 2011-03-08T00:24:55.450 回答