首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setTimeout ()与setTimeout ()中的setTimeout ()的区别

setTimeout ()与setTimeout ()中的setTimeout ()的区别
EN

Stack Overflow用户
提问于 2014-01-15 19:52:04
回答 2查看 133关注 0票数 0

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

代码语言:javascript
复制
setTimeout ("move ()", 3000);

通过以下方式:

代码语言:javascript
复制
setTimeout (function () {setTimeout ("move", 3000)}, 100);

感谢我的朋友们,他们把答案吓呆了。

EN

回答 2

Stack Overflow用户

发布于 2014-01-15 21:15:37

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

代码语言:javascript
复制
setTimeout ("move()", 3000); // executes move(); - a function call
setTimeout ("move", 3000); // executes move; - a statement that doesn't do anything

第二个区别是在何时执行有用的代码:

代码语言:javascript
复制
setTimeout ("move()", 3000); // move() gets called at T+3000
setTimeout (function () {setTimeout ("move()", 3000)}, 100); // move() gets called at T+3100

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

代码语言:javascript
复制
setTimeout (move, 3000);

第一个代码是直接的。当该行被执行时,对的调用被调度为在该时间之后的至少3000ms之后执行。“至少”很重要,因为如果JS引擎忙于执行其他代码,事件处理程序在应该执行之后可能会延迟很长一段时间。

代码语言:javascript
复制
setTimeout (function () {setTimeout (move, 3000)}, 100);

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

下面是一个可以延迟执行的示例:

代码语言:javascript
复制
setTimeout (function () {setTimeout (move, 3000)}, 100);
var d = new Date();
while ((new Date()).getTime() - 10000 < d.getTime()) ; // busy wait for 10 seconds

正如前面所解释的,一些代码(不管是什么)被安排在至少100毫秒后执行。然而,在接下来的10秒内,浏览器将忙于执行while。经过10秒之后,浏览器就可以处理其他事件了,比如预定的代码。总而言之,move函数在第一次调用setTimeout之后(至少) 13秒被调用。

总而言之,差异是微妙的,在上面的简单场景中,没有任何东西可以证明在另一个调用setTimeout的内部调用setTimeout是合理的。如果程序逻辑需要它,也没有什么本质上不好的东西。

票数 0
EN

Stack Overflow用户

发布于 2014-12-16 19:35:27

有趣的问题,两个不同

首先,让我们定义一下:

移动方法A: setTimeout ("move ()",3000);函数方法B:(

  • () {setTimeout ("move",3000)},100);

1. javascript vm的不同编译顺序

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

尝试下面的demo:

代码语言:javascript
复制
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只有窗口或文档的上下文。

尝试下面的demo:

代码语言:javascript
复制
(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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21136689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档