简体   繁体   English

解决方法让关键字?

[英]Workaround for let keyword?

How can I get this 我怎么能得到这个

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

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

To alert 1 , 2 and 3 without using let keyword? alert 123 ,而不使用let关键字?

or bind an event on an element ( 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] );
    });
}

Use a self-executing anonymous function and pass in i as an argument for variable closure. 使用自执行的匿名函数并将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. 这是一个例子。

You need to make use of a closure. 您需要使用闭包。 I typically create a "generator" function that returns a function which is defined in the desired context: 我通常创建一个“生成器”函数,该函数返回在所需上下文中定义的函数:

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);
}

More info and good examples here: https://developer.mozilla.org/en/JavaScript/Guide/Closures 此处提供了更多信息和良好示例: 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);

This should do it. 这应该做。

var codes = [1, 2, 3];

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

Use a self-executing function : 使用自执行功能

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

Optionally using a var statement for more verbose code: (可选)使用var语句获取更多详细代码:

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

Or use a named function instead if you want to: 或使用命名函数来代替:

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

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

Either example forms a closure, which introduces new variable scope. 这两个示例都构成一个闭包,它引入了新的变量作用域。 Alternatively, ES5 has Function.bind that could be used on the anonymous function, but it is not universally supported in all browsers yet. 另外,ES5具有Function.bind ,可以在匿名函数中使用,但它不是普遍在所有的浏览器都支持呢。 (I'm thinking of IE.) (我正在考虑IE。)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM