我最近遇到了需要setTimeout
在循环中使用 a 的独特情况。了解这一点可以帮助您了解如何将参数传递给setTimeout
.
方法一
根据 Sukima 的建议使用forEach
and :Object.keys
var testObject = {
prop1: 'test1',
prop2: 'test2',
prop3: 'test3'
};
Object.keys(testObject).forEach(function(propertyName, i) {
setTimeout(function() {
console.log(testObject[propertyName]);
}, i * 1000);
});
我推荐这种方法。
方法二
使用bind
:
var i = 0;
for (var propertyName in testObject) {
setTimeout(function(propertyName) {
console.log(testObject[propertyName]);
}.bind(this, propertyName), i++ * 1000);
}
JSFiddle:http : //jsfiddle.net/MsBkW/
方法三
或者,如果您不能使用forEach
or bind
,请使用IIFE:
var i = 0;
for (var propertyName in testObject) {
setTimeout((function(propertyName) {
return function() {
console.log(testObject[propertyName]);
};
})(propertyName), i++ * 1000);
}
方法四
但如果你不关心 IE < 10,那么你可以使用 Fabio 的建议:
var i = 0;
for (var propertyName in testObject) {
setTimeout(function(propertyName) {
console.log(testObject[propertyName]);
}, i++ * 1000, propertyName);
}
方法 5 (ES6)
使用块作用域变量:
let i = 0;
for (let propertyName in testObject) {
setTimeout(() => console.log(testObject[propertyName]), i++ * 1000);
}
虽然我仍然建议在 ES6 中使用Object.keys
with forEach
。