let关键字的解决方法?

我怎么能得到这个
var i = 0;
var codes = [1, 2, 3];

for (var i = 0; i < codes.length; ++i)
{
    setTimeout(function(){alert(codes[i]);},100);
}
不使用
let
关键字到
alert
1
2
3
? 或绑定元素上的事件(示例):
var i = 0;
var codes = [1, 2, 3];

for (var i = 0; i < codes.length; ++i)
{
    $("div").eq(i).click(function(){
        alert( codes[i] );
    });
}
    
已邀请:
使用自执行匿名函数并传入
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);
}
这是一个例子。     
你需要使用一个闭包。我通常创建一个“生成器”函数,它返回一个在所需上下文中定义的函数:
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     
var i = 0;
var codes = [1, 2, 3];

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

setTimeout(timeoutFunc, 100);
    
这应该做到这一点。
var codes = [1, 2, 3];

for (var i = 0; i < codes.length; ++i)
    setTimeout(function(code){return function(){
        alert(code);
    }}(codes[i]), 100);
    
使用自执行功能:
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。)     

要回复问题请先登录注册