我看到这个用了很多,有人告诉我把函数引用放在引号之间是不好的,因为setTimeout
/setInterval
evals
引用。这两者之间的实际区别是什么,一个被使用在另一个之上,为什么我看到这个被如此频繁地使用,即使它应该是常识,这种方式是不好的?
问问题
287 次
3 回答
3
人们可能没有意识到他们可以使用不带引号的形式。
字符串中引用的名称可能尚未定义。
引用的表格让您延迟执行:
setTimeout("myFunction(1, 'hello')", 100)
比以下更容易理解:
setTimeout(function () { myFunction(1, 'hello') }, 100)
这不符合作者的要求:
setTimeout(myFunction(1, 'hello'), 100)
于 2012-07-24T01:20:27.283 回答
1
这两种形式有两个主要区别:
setTimeout("myFunc()", 100);
和
setTimeout(myFunc, 100);
第一个效率较低,它在全局范围内评估函数,因此您不能将本地函数或任何非全局函数传递给它。
看看效率参数,如果你想调用代码中的函数,你会写:
x = myFunc();
或者你会写:
x = eval("myFunc()");
当然,你会写第一个,因为:
- 这就是您通常编写javascript的方式
- 函数引用可以在解释器的第一次传递中解析一次,而不是每次执行时
- 缩小器/优化器可以使用第一个重命名您的符号,但不能使用第二个。
- 您可以使用第一个调用本地函数,但第二个需要全局函数
eval()
是一个相当重量级的东西,只有在没有其他更好的方法时才应该使用它。
仅供参考,这个 jsPerf 比较表明该eval()
版本慢了 96%。在某些情况下,性能可能无关紧要,但您可以了解它的效率有多低。
于 2012-07-24T01:46:55.300 回答
0
我敢打赌它还可以防止内存泄漏。
不泄漏 X:
var x = $("loading");
setTimeout("createTree(1);", 0);
泄漏的 X:
var x = $("loading");
setTimeout(function(){createTree(1);}, 0);
于 2012-07-24T01:36:05.913 回答