lon*_*day 22 javascript settimeout
我们都知道将字符串传递给setTimeout(或setInterval)是邪恶的,因为它在全局范围内运行,有性能问题,如果你注入任何参数等可能是不安全的.所以这样做肯定是不赞成的:
setTimeout('doSomething(someVar)', 10000);
Run Code Online (Sandbox Code Playgroud)
赞成这个:
setTimeout(function() {
doSomething(someVar);
}, 10000);
Run Code Online (Sandbox Code Playgroud)
我的问题是:有没有理由去做前者?它是有史以来最好?如果不是,为什么甚至允许?
我想到的唯一场景是想要使用存在于全局范围中但在本地范围内被覆盖的函数或变量.这听起来像是糟糕的代码设计,但是......
Mar*_*pel 16
你总是可以通过访问全局变量作为窗口对象的属性来window.globalVar使用全局变量(尽管使用全局变量确实不是一个好习惯),所以不,我认为没有充分的理由使用不推荐的语法.
它可能是出于历史原因而允许的:正如Felix Kling所提到的,原始语法只允许传递一串代码:
推出了JavaScript 1.0,Netscape 2.0.使用JavaScript 1.2,Netscape 4.0引入了传递Function对象的引用 ; 自5.0版以来由MSHTML DOM支持.[ 来源,我的重点]
如果浏览器不支持使用字符串作为第一个参数setTimeout和setInterval了,会有很多的代码无法再发挥作用了互联网上.
Jer*_*her 15
对于那些因为传递函数比传递字符串更好的问题而被重定向的人.
1:传递字符串会激活编译器
每次必须评估字符串时,都会启动完整的编译器.对于需要它的每次调用.
这不仅速度慢,而且还会破坏所有JIT和浏览器的加速.
2:传递字符串更受限制.
因为字符串是通过编译器运行的,所以它不能完全绑定到本地作用域和变量.
虽然在以下情况下不明显:
window.setInterval("doThing()");
Run Code Online (Sandbox Code Playgroud)
在更复杂的情况下,代码更简洁:
window.setInterval("doThing(" + val1 + "," + val2 + ")");
Run Code Online (Sandbox Code Playgroud)
VS
window.setInterval(function() {
// You can put a debugging point here
dothing(val1, val2);
});
Run Code Online (Sandbox Code Playgroud)
3:DOM对象不能通过字符串传递
正如Álvaro所提到的,DOM对象不能通过字符串方法传递.
// There is no way to do this via a string.
var el = document.getElementById("my-element");
window.setInterval(function() {
dothing(el);
});
Run Code Online (Sandbox Code Playgroud)
(其他对象可能会或可能不会通过 - 取决于它们是否可以序列化,但通常情况下会非常困难.)