学JS就行了。在我看来,函数setTimeout代码区域应该像正常工作一样工作,但是它不是,exp:
var result = 0;
(function (i){
if(i > 0){
result = result + i;
i = i - 1;
setTimeout("arguments.callee(" + i + ")",100);//arguments.callee(i);
}
else if(i == 0)
return;
}(10));
alert(result);
我要它警告55,而不是10,如果删除setTimeout,它将是好的。有人知道为什么吗?
发布于 2013-10-27 19:40:50
试一试
var result = 0;
(function (i, callback) {
if (i > 0) {
result = result + i;
i = i - 1;
var callee = arguments.callee;
setTimeout(function () {
callee(i, callback)
}, 100);
} else if (i == 0) {
callback();
}
}(10, function () {
alert(result);
}));
演示:小提琴
为什么?
您的方法存在多个问题。
setTimeout
时,它将在全局范围内执行,即arguments.callee
将引用与您预期不同的对象。发布于 2013-10-27 19:39:31
因为setTimeout
是异步的,所以简单地说,这意味着它将在稍后执行。JS不等待它(不会在该行停止代码),而是运行后续代码。
因此,当您稍后设置它时,代码将继续在“超时值循环”之外并进入警报。在此期间,循环只执行了一个循环,而result
只添加了10个。
你能做的是:
发布于 2013-10-27 21:21:34
鉴于此:
考虑在IIFE中声明函数(根据我认为您想要的内容进行调整-在10次迭代后发出警报,显示结果为10):
var result = 0;
(function (i){
function foo(j) {
if(j > 0){
++result;
setTimeout(function(){foo(--j)},100);
} else {
alert('Result: ' + result);
}
}
foo(i);
}(10));
注意,没有其他块的必要(除非您想返回undefined
以外的东西)。
请注意,在ES5和其他支持它的浏览器(而不是IE < 9)中,您可以在调用setTimeout时传递参数:
setTimeout(foo, 100, --j);
所以你保存了一个额外的函数对象。
https://stackoverflow.com/questions/19626793
复制