4

我看到这个用了很多,有人告诉我把函数引用放在引号之间是不好的,因为setTimeout/setInterval evals引用。这两者之间的实际区别是什么,一个被使用在另一个之上,为什么我看到这个被如此频繁地使用,即使它应该是常识,这种方式是不好的?

4

3 回答 3

3
  1. 人们可能没有意识到他们可以使用不带引号的形式。

  2. 字符串中引用的名称可能尚未定义。

  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()");

当然,你会写第一个,因为:

  1. 这就是您通常编写javascript的方式
  2. 函数引用可以在解释器的第一次传递中解析一次,而不是每次执行时
  3. 缩小器/优化器可以使用第一个重命名您的符号,但不能使用第二个。
  4. 您可以使用第一个调用本地函数,但第二个需要全局函数
  5. 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 回答