Javascript let关键字的解决方法?

Javascript let关键字的解决方法?,javascript,let,Javascript,Let,我怎么能得到这个 var i = 0; var codes = [1, 2, 3]; for (var i = 0; i < codes.length; ++i) { setTimeout(function(){alert(codes[i]);},100); } var i=0; 风险值代码=[1,2,3]; var timeoutpunc=函数(){ 警报(代码[i++]); 如果(i

我怎么能得到这个

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

for (var i = 0; i < codes.length; ++i)
{
    setTimeout(function(){alert(codes[i]);},100);
}
var i=0;
风险值代码=[1,2,3];
var timeoutpunc=函数(){
警报(代码[i++]);
如果(i<代码长度){
setTimeout(timeoutpunc,100);
}
};
setTimeout(timeoutpunc,100);
var i=0;
风险值代码=[1,2,3];
var timeoutpunc=函数(){
警报(代码[i++]);
如果(i<代码长度){
setTimeout(timeoutpunc,100);
}
};
setTimeout(timeoutpunc,100);

使用自动执行的匿名函数并传入
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;
风险值代码=[1,2,3];
对于(变量i=0;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;
风险值代码=[1,2,3];
对于(变量i=0;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);
}
var i=0;
风险值代码=[1,2,3];
函数回调生成器(i){
返回函数(){alert(代码[i]);}
}
对于(变量i=0;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);
}
var i=0;
风险值代码=[1,2,3];
函数回调生成器(i){
返回函数(){alert(代码[i]);}
}
对于(变量i=0;i
这里有更多信息和好例子:

这应该可以

var codes = [1, 2, 3];

for (var i = 0; i < codes.length; ++i)
    setTimeout(function(code){return function(){
        alert(code);
    }}(codes[i]), 100);
var代码=[1,2,3];
对于(变量i=0;i
这应该可以

var codes = [1, 2, 3];

for (var i = 0; i < codes.length; ++i)
    setTimeout(function(code){return function(){
        alert(code);
    }}(codes[i]), 100);
var代码=[1,2,3];
对于(变量i=0;i
使用:

如果要执行以下操作,请使用命名函数:

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

for (var i = 0; i < codes.length; ++i) {
    foo(i);
}
函数foo(i){ setTimeout(函数(){alert(代码[i]);},100); } 对于(变量i=0;i 这两个示例都形成了一个闭包,它引入了新的变量范围。或者,ES5提供了可以用于匿名函数的功能,但并非所有浏览器都支持它。(我在考虑IE)

使用:

如果要执行以下操作,请使用命名函数:

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

for (var i = 0; i < codes.length; ++i) {
    foo(i);
}
函数foo(i){ setTimeout(函数(){alert(代码[i]);},100); } 对于(变量i=0;i
这两个示例都形成了一个闭包,它引入了新的变量范围。或者,ES5提供了可以用于匿名函数的功能,但并非所有浏览器都支持它。(我在想IE。)

这会导致所有3个同时关闭,这是期望的功能吗?如果不是,他可以将设置超时的延迟更改为
100*(索引+1)
这会导致所有3个同时关闭,这是期望的功能吗?如果不是,他可以将设置超时的延迟更改为
100*(索引+1)