为什么人们使用setTimeout(“func()”,...)而不是setTimeout(func,...)

时间:2012-07-24 01:17:28

标签: javascript

我看到这个用了很多,我被告知在引号之间放置函数引用是不好的,因为setTimeout / setInterval evals引用。这两者之间的实际差异是什么,一个用于另一个,为什么我会这么频繁地使用它,即使应该知道这种方式很糟糕?

3 个答案:

答案 0 :(得分:3)

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

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

  3. 引用的表单会延迟执行:

    setTimeout("myFunction(1, 'hello')", 100)
    

    比以下更容易理解:

    setTimeout(function () { myFunction(1, 'hello') }, 100)
    

    并且这不符合作者的要求:

    setTimeout(myFunction(1, 'hello'), 100)
    

答案 1 :(得分:1)

这两种形式有两个主要区别:

setTimeout("myFunc()", 100);

setTimeout(myFunc, 100);

第一个效率较低,它会评估全局范围内的函数,因此您无法将其传递给本地函数或任何非全局函数。

看看效率参数,如果你想调用代码中的函数,你会写:

x = myFunc();

或者你会写:

x = eval("myFunc()");

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

  1. 这就是你通常写javascript的方式
  2. 函数引用可以在解释器的第一遍中解析一次,而不是每次执行时解析
  3. Minifiers / optimizers可以使用第一个而不是第二个重命名您的符号。
  4. 您可以使用第一个函数调用本地函数,但第二个函数需要全局函数
  5. eval()是一个相当重要的东西,只有在没有其他更好的方法时才应该使用它。
  6. 仅供参考,this jsPerf comparison表示eval()版本慢了96%。在某些情况下,性能可能并不重要,但您可以了解效率低得多。

答案 2 :(得分:0)

我敢打赌它也可以防止内存泄漏。

不泄漏X:

var x = $("loading");
setTimeout("createTree(1);", 0);

泄漏的X:

var x = $("loading");
setTimeout(function(){createTree(1);}, 0);