在setTimeout()中使用setTimeout()的setTimeout()差异

时间:2014-01-15 11:52:04

标签: javascript dependency-injection settimeout

任何人都可以帮助我,我想知道其中的区别:

setTimeout ("move ()", 3000);

使用:

setTimeout (function () {setTimeout ("move", 3000)}, 100);
感谢我的朋友们,他们的回答很糟糕。

2 个答案:

答案 0 :(得分:0)

首先,最重要的区别在于执行的实际有用代码:

setTimeout ("move()", 3000); // executes move(); - a function call
setTimeout ("move", 3000); // executes move; - a statement that doesn't do anything

第二个区别在于执行有用代码的时间:

setTimeout ("move()", 3000); // move() gets called at T+3000
setTimeout (function () {setTimeout ("move()", 3000)}, 100); // move() gets called at T+3100

最后一个区别也在于执行有用的代码时,但它更加微妙。 JavaScript是单线程的,带有事件循环。超时可以被视为事件本身,因为它们与常规DOM事件一起参与相同的事件循环。

setTimeout (move, 3000);

第一个代码是直截了当的。当执行该行时,调度移动计划在此之后执行至少 3000ms。 "至少"很重要,因为如果JS引擎忙于执行其他代码,事件处理程序可能会在它们被执行后延迟很长一段时间。

setTimeout (function () {setTimeout (move, 3000)}, 100);

第二个代码大致相同,调度与之前相同的调度* 至少* 在遇到该行后100ms。

可以延迟执行的一个例子是:

setTimeout (function () {setTimeout (move, 3000)}, 100);
var d = new Date();
while ((new Date()).getTime() - 10000 < d.getTime()) ; // busy wait for 10 seconds

如前所述,一些代码(并不重要)计划在至少100ms后执行。然而,在接下来的10秒内,浏览器正忙着执行while。经过10秒后,浏览器已准备好处理其他事件,例如预定代码。总的来说,移动函数在第一次调用setTimeout后被调用(至少)13秒。

总而言之,差异是微妙的,如上所述,在一个简单的场景中,没有什么可以证明在另一个setTimeout调用中调用setTimeout是正确的。如果程序逻辑需要它,那么也没有什么本质上的坏。

答案 1 :(得分:0)

有趣的问题,两个不同

首先让我们定义:

  • 方法A:setTimeout(“move()”,3000);
  • 方法B:setTimeout(function(){setTimeout(“move”,3000)},100);

1. javascript vm的不同编译顺序

对于一个javascript尝试将str编译成可运行的代码并在3000毫秒后运行它,而B尝试立即将该函数编译成可运行的代码,但是在3000毫秒后运行它。

尝试以下演示:

setTimeout ('alert("A")', 3000); 
// "A" alerted after 3000 milliseconds
setTimeout (alert('B')||function(){alert('C')}, 3000); 
// "B" alerted instantly, while C alerted after 3000 milliseconds 

2.不同的使用范围

B可以有更大的使用范围,因为B可以通过使用闭包来携带任何变量作为上下文,但是A只有窗口或文档的上下文。

尝试以下演示:

(function(){var va = 1; setTimeout ('alert(va)', 3000)}());
// run into error:Uncaught ReferenceError: va is not defined after 3000 milliseconds
(function(){var vb = 1; setTimeout(function(){alert(vb)}, 3000);}()); 
// 1 alerted after 3000 milliseconds