为什么此函数返回垃圾值后跟5 5s
for (var j = 0; j < 5; j++) {
setTimeout(function () {
console.log(j);
}, 1000);
}
答案 0 :(得分:0)
观察到的行为符合要求。您可以将代码更新为以下
for(var j=0;j<5;j++){
(function(index){
setTimeout(function(){console.log(index);},1000);
})(j);
}
以上绘制了预期/正确的值,即0,1,2,3,4
根据问题,所有超时函数都共享一个公共变量j,因此,当第一次记录完成时,直到那时j已经更新为5.
因此,您需要确保每个超时功能都有私有副本。因此,为了获得预期/正确的值,您需要使用闭包。
答案 1 :(得分:0)
返回的值从setTimeout()
返回。它不是垃圾值,它是超时的id。
timeoutID是超时的数字ID,稍后可以使用window.clearTimeout()。
清除超时时使用与timeout
关联的此ID。
var timeoutID = setTimeout(function() {
console.log('hello');
}, 1000);
clearTimeout(timeoutID);
您的代码中的另一个问题是它始终在控制台中打印5
。因为,执行setTimeout回调的时间,循环已经执行,j
的值为5
。
要解决这个问题,请在循环中使用 closure 。
for (var j = 0; j < 5; j++) {
(function(j) {
setTimeout(function() {
document.write(j + '<br />');
}, 1000);
}(j));
}
&#13;