任何人都可以帮助我,我想知道其中的区别:
setTimeout ("move ()", 3000);
使用:
setTimeout (function () {setTimeout ("move", 3000)}, 100);
感谢我的朋友们,他们的回答很糟糕。
答案 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)
有趣的问题,两个不同
首先让我们定义:
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