我怎样才能得到这个
var i = 0;
var codes = [1, 2, 3];
for (var i = 0; i < codes.length; ++i)
{
setTimeout(function(){alert(codes[i]);},100);
}
要alert
1
,2
和3
而不使用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] );
});
}
答案 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);
}
答案 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)
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。)