2010-11-12 46 views
4

我試圖讓我的代碼JavaScript「嚴格」,所以我通過運行它JSLint確保我的代碼是兼容的。JavaScript:如何消除此錯誤?

然而,在下面的代碼:

setTimeout("getExtJs()", 2000); 

我收到以下錯誤:

Implied eval is evil. Pass a function instead of a string. 

如何讓我的代碼JavaScript的 「嚴」?

+0

請標記爲已接受的答案。 (點擊旁邊的小複選標記)。 – Adam 2012-09-06 23:34:40

回答

3

如果你這樣做不應該抱怨:

setTimeout(function(){ 
    // your code of this function getExtJs here 
}, 2000); 

或者:

setTimeout(getExtJs, 2000); 

雖然我看不出有什麼錯在你實現安全,明智或以其他方式。

+0

作爲一個方面說明 - 使用匿名函數執行另一個可以按名稱調用的函數並不是一個好主意。如果您打算一次性執行,而且其他地方從不重複,或者您有重大的範圍要求,則只能使用匿名函數。 – mway 2010-11-12 18:15:31

+0

@ mway:燁同意:) – Sarfraz 2010-11-12 18:16:25

14
setTimeout(getExtJs, 2000); 

請注意,getExtJs周圍沒有引號,我傳遞的函數不是String。

編輯: 作爲評價爲什麼JSLint的是不高興的原因是注意,當第一個參數是作爲代碼以相同的方式,與eval()

見執行其處理的字符串https://developer.mozilla.org/en/window.setTimeout

要了解爲什麼eval()(以及使用字符串作爲第一個參數的擴展名)是邪惡的,請參閱Mozilla Developer Network entry for eval

+1

+1。但爲了絕對完整,您可能想要添加如何將字符串作爲第一個參數進行評估,而將表達式作爲第一個參數進行評估。 – Gopherkhan 2010-11-12 19:32:47

1

像它說,在傳遞函數(周圍的函數名稱不包括引號):

setTimeout(getExtJs, 2000); 

當您在一個字符串("getExtJs")傳球,setTimeout結束了eval荷蘭國際集團它。取而代之的是,最好簡單地傳遞函數本身(getExtJs)。

+0

這將設置getExtJs()的結果作爲setTimeout的第一個參數,這可能不是所需的效果。 – mway 2010-11-12 18:10:52

+0

這將立即執行該函數並運行任何'getExtJs'從現在開始返回2秒,這不是OP所做的。 – lincolnk 2010-11-12 18:11:23

+0

@mway,@lincolnk - 很對。答案已更新。 – Oded 2010-11-12 18:11:57

1
setTimeout(function() {getExtJs();}, 2000); 
1

正確的語法是

setTimeout(getExtJs, 2000); 

你傳遞給函數的引用,2000毫秒後執行的功能。如果你在函數名後面加上parens,那麼你正在執行函數而不是引用它。