let关键字的解决方法?

时间:2011-03-08 00:09:44

标签: javascript let

我怎样才能得到这个

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

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

alert 123而不使用let关键字?

或绑定元素上的事件( example ):

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

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

5 个答案:

答案 0 :(得分: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);
}

Here's an example.

答案 1 :(得分: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

答案 2 :(得分: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);

答案 3 :(得分:1)

这应该这样做。

var codes = [1, 2, 3];

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

答案 4 :(得分:1)

使用self-executing function

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。)