再次设置setTimeout与setInterval

fre*_*ish 3 javascript settimeout setinterval

所以我知道setTimeout和之间存在差异setInterval,但请考虑以下两个代码示例:

function myFunction(){
   setTimeout('myFunction();', 100);
   doSomething();
}
setTimeout('myFunction();', 100);
Run Code Online (Sandbox Code Playgroud)

function myFunction(){
   doSomething();
}
setInterval('myFunction();', 100);
Run Code Online (Sandbox Code Playgroud)

需要注意的是在第一个例子中,我调用setTimeout在函数的开头,然后我doSomething.因此没有额外的延迟doSomething().这是否意味着这两个例子完全相同?还是有更微妙的区别?

T.J*_*der 11

它们在功能上大致相同,但存在差异.一个区别在于浏览器如果处理doSomething时间长于间隔时间.随着setInterval,至少某些浏览器将只跳过如果下一个区间doSomething仍在运行.因此,如果您使用100毫秒,并doSomething运行110毫秒,下一次运行将不会发生,直到90毫秒(当然,所有这些时间都是近似值).

另一个不同之处在于,setTimeout每次你都会得到一个新的手柄,而setInterval你得到一个手柄.

与给出的示例的另一个不同之处在于,在setTimeout示例中,您每次都会启动JavaScript解析器/编译器,而setInterval您只需启动解析器/编译器一次.但这种差异并不重要,因为你根本不应该这样做 - 见下文.

但除了细微之处,你在那里拥有的功能是相同的.


旁注:将字符串传递给其中一个setTimeout或哪个不是最佳做法setInterval.相反,传入一个函数引用:

// setTimeout
function myFunction(){
   setTimeout(myFunction, 100);
   doSomething();
}
setTimeout(myFunction, 100);

// setInterval
function myFunction(){
   doSomething();
}
setInterval(myFunction, 100);
Run Code Online (Sandbox Code Playgroud)

传入一个字符串会激活一个JavaScript解析器并执行相同的操作eval.应该尽可能避免(而且几乎总是可能的).