2012-01-31 55 views
1

我是java腳本的新手,目前正在閱讀John Resig的JavaScript JavaScript技巧。在解釋關閉時,他將setTimeout("otherFunction()",2000)稱爲新JS開發人員遇到問題的情況。我無法理解爲什麼這是一個問題?有人可以解釋一下嗎?在http://www.w3schools.com/js/js_timing.asp中,我看到一個類似於我的電話var t=setTimeout("alertMsg()",3000);setTimeout(「otherFunction()」,2000)爲什麼是錯的?

+7

你已經找到了爲什麼w3schools不是一個很好的學習網站的幾個例子之一。有關更多信息,請參見http://w3fools.com/ – 2012-01-31 08:00:56

回答

6

這是不是「錯」,它只是不一定是「正確的」,它當然不推薦。

setTimeout() function的第一個參數可以是字符串或函數參考/函數表達式。

如果你傳遞一個字符串,它將會變慢,因爲你實際上在做一個eval()這就是not recommended。比速度更重要的是,字符串中的代碼執行的範圍可能不是你所期望的(並且在不同的瀏覽器中可能不一樣)。

通過傳遞函數引用/函數表達式,可以避免這些問題。

「正確」的語法您的例子是:

setTimeout(otherFunction, 2000); 

注意有沒有括號otherFunction後 - 如果有它會立即打電話otherFunction()並從該函數傳遞返回值setTimeout()

如果你需要傳遞參數給你的功能,你可以在一個匿名函數把它包:

setTimeout(function() { 
    otherFunction(param1, param2); 
}, 2000); 

這似乎那種笨重相比setTimeout("otherFunction(param1,param2)", 2000),但它再次與其中otherFunctionparam1範圍避免問題和param2被定義。

+0

+1提到的範圍。 – CMS 2012-01-31 08:09:28

+0

優秀的答案。 – molf 2012-01-31 08:12:33

5

建議的方法是使用以下命令:

setTimeout(otherFunction, 2000); 

或關閉:

setTimeout(function() { 
    otherFunction(); 
}, 2000); 

不要使用這需要一個字符串作爲第一個參數過載,因爲JavaScript解釋器將需要將此字符串解析爲JavaScript代碼。

是的,你鏈接到http://www.w3schools.com的網站可能是學習編程最糟糕的網站之一。它顯示了你不應該做的事情。

+3

-1「爲什麼不在setTimeout中使用字符串?」 - 「因爲推薦的方法是不使用字符串。」 – molf 2012-01-31 08:03:29

+0

@molf,是的,正是出於這個原因。你真的不希望強制解釋器一遍又一遍地將你的字符串解析爲javascript代碼。 – 2012-01-31 08:05:24

+2

我相信@molf所做的一點是你沒有解釋_why_字符串是不推薦的。 – nnnnnn 2012-01-31 08:10:55

1

因爲它每次都必須evalotherFunction()(並因此產生一個解釋器的新實例)。如果您提供該函數的參考,則setTimeout可以執行它,而不必產生新的解釋器。

所以使用:

setTimeout(otherFunction,2000); 
+0

「產卵新實例」正是這個原因,而不是「不推薦」左右。 – georg 2012-01-31 09:06:49

1

任何包含在「」是一個字符串,一個JavaScript解釋器通常需要解析的字符串。

即使工作,解析字符串也是不必要的。

如果我們簡單地用

setTimeout(alertMsg,3000);

做任何額外的(不必要的)工作,從而更好地代碼解釋是不需要的。

0

而不是setTimeout("otherFunction()",2000),直接通過做 setTimeout(otherFunction,2000)要好得多。以前的方法必須做eval字符串"otherFunction()"

相關問題