一尘不染

是否有充分的理由将字符串传递给setTimeout?

javascript

我们都知道,将字符串传递给setTimeout(或setInterval)是邪恶的,因为它是在全局范围内运行的,存在性能问题,如果您注入任何参数等,则可能不安全。因此,绝对不建议这样做:

setTimeout('doSomething(someVar)', 10000);

赞成:

setTimeout(function() {
    doSomething(someVar);
}, 10000);

我的问题是:有没有理由做前者?有 没有 更好的选择?如果不是,为什么甚至允许呢?

我想到的唯一一种情况是希望使用全局范围内存在但局部范围已被覆盖的函数或变量。在我看来,这听起来像是糟糕的代码设计,但是…


阅读 228

收藏
2020-04-25

共1个答案

一尘不染

您始终可以通过将全局变量作为窗口对象的属性来访问来使用全局变量,例如window.globalVar(尽管使用全局变量确实不是一个好习惯),所以不,我认为没有充分的理由使用不赞成使用的语法。

可能由于历史原因而被允许:正如Felix Kling所述,原始语法只允许传递代码字符串:

在JavaScript 1.0,Netscape 2.0中引入。 在JavaScript 1.2,Netscape4.0中引入了传递函数对象参考 ;从5.0版开始受MSHTML DOM支持。

如果浏览器不支持使用字符串作为第一个参数setTimeoutsetInterval了,会有很多的代码无法再发挥作用了互联网上。

2020-04-25