2012-07-24 53 views
4

我看到這用了很多,我被告知把函數引用之間的報價不好,因爲setTimeout/setIntervalevals參考。這兩者之間的實際區別是什麼,一個用在另一個之上,爲什麼我會這麼頻繁地使用它,即使這種方式不好應該是常識?爲什麼人們使用setTimeout(「func()」,...)而不是setTimeout(func,...)

+1

因爲人是愚蠢的。政治上更加正確,因爲使用流行並不意味着最佳實踐......根據其個人內在優點使用一段代碼,不是因爲它是「普通」或「酷」的東西。 – 2012-07-24 01:19:18

回答

3
  1. 人們可能沒有意識到他們可以使用不加引號的形式。

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

  3. 引述的形式爲您提供了延遲執行:

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

    比更容易理解:

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

    ,這沒有做筆者想要的東西:

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

最後一個*確實有效*。它只是不會做一些人可能期望的。 – kojiro 2012-07-24 01:21:44

+0

你的意思是它不會引發錯誤。它不符合作者的意圖。在上面澄清。 – 2012-07-24 01:24:39

+0

鑑於你是這種情況下的作者,我不能與此爭論。我的觀點更多的是你可能會讓'myFunction'返回一個函數或一個可評估的字符串。 – kojiro 2012-07-24 01:27:48

0

我敢打賭,它也可以防止m埃默裏泄漏。

不泄漏X:

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

泄漏的X:

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

你有這方面的來源嗎? – Dennis 2012-07-24 01:38:16

+1

@丹尼斯 - 不太可能,但可能。 @Kernel James - 你能解釋內存泄漏是如何發生的嗎?或者發佈一個它的實例?或者爲什麼涉及jQuery? – RobG 2012-07-24 02:32:23

+0

這沒有任何意義。 'setTimeout()'應該對'x'發生什麼影響。 – jfriend00 2012-07-24 03:34:08

1

有這兩種形式之間的兩個主要區別:

setTimeout("myFunc()", 100); 

setTimeout(myFunc, 100); 

第一個效率較低,它在全局範圍內評估函數,因此您不能將它傳遞給本地函數或任何非全局函數。

在看效率的說法,如果你想叫你在你的代碼了,你會寫一個函數:

x = myFunc(); 

或者你可以這樣寫:

x = eval("myFunc()"); 

當然,你會寫第一個因爲:

  1. 這就是你通常寫的javascript
  2. 函數引用可以在解釋器的第一遍中解析一次,而不是在每次執行時解析一次
  3. 解析器/優化器可以使用第一次而不是第二次重命名符號。
  4. 可以調用本地函數與第一個,但第二個需要一個全球性的功能
  5. eval()只有在沒有其他更好的辦法做到這一點,應使用一個相當重量級的東西。

僅供參考,this jsPerf comparison表示eval()版本慢96%。在某些情況下,表現可能並不重要,但你可以明白它的效率。

相關問題