我是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)爲什麼是錯的?
回答
這是不是「錯」,它只是不一定是「正確的」,它當然不推薦。
setTimeout()
function的第一個參數可以是字符串或函數參考/函數表達式。
如果你傳遞一個字符串,它將會變慢,因爲你實際上在做一個eval()
這就是not recommended。比速度更重要的是,字符串中的代碼執行的範圍可能不是你所期望的(並且在不同的瀏覽器中可能不一樣)。
通過傳遞函數引用/函數表達式,可以避免這些問題。
「正確」的語法您的例子是:
setTimeout(otherFunction, 2000);
注意有沒有括號otherFunction
後 - 如果有它會立即打電話otherFunction()
並從該函數傳遞返回值setTimeout()
。
如果你需要傳遞參數給你的功能,你可以在一個匿名函數把它包:
setTimeout(function() {
otherFunction(param1, param2);
}, 2000);
這似乎那種笨重相比setTimeout("otherFunction(param1,param2)", 2000)
,但它再次與其中otherFunction
,param1
範圍避免問題和param2
被定義。
建議的方法是使用以下命令:
setTimeout(otherFunction, 2000);
或關閉:
setTimeout(function() {
otherFunction();
}, 2000);
不要使用這需要一個字符串作爲第一個參數過載,因爲JavaScript解釋器將需要將此字符串解析爲JavaScript代碼。
是的,你鏈接到http://www.w3schools.com的網站可能是學習編程最糟糕的網站之一。它顯示了你不應該做的事情。
因爲它每次都必須eval
otherFunction()
(並因此產生一個解釋器的新實例)。如果您提供該函數的參考,則setTimeout
可以執行它,而不必產生新的解釋器。
所以使用:
setTimeout(otherFunction,2000);
「產卵新實例」正是這個原因,而不是「不推薦」左右。 – georg 2012-01-31 09:06:49
任何包含在「」是一個字符串,一個JavaScript解釋器通常需要解析的字符串。
即使工作,解析字符串也是不必要的。
如果我們簡單地用
setTimeout(alertMsg,3000);
,
做任何額外的(不必要的)工作,從而更好地代碼解釋是不需要的。
而不是setTimeout("otherFunction()",2000)
,直接通過做 setTimeout(otherFunction,2000)
要好得多。以前的方法必須做eval
字符串"otherFunction()"
。
- 1. setTimeout的語法是什麼?
- 2. 爲什麼人們使用setTimeout(「func()」,...)而不是setTimeout(func,...)
- 3. 爲什麼settimeout塊eventloop
- 4. setTimeout爲什麼非高效
- 5. Angular的setTimeout的目的是什麼?
- 6. 爲什麼setTimeout的是不是在JavaScript執行
- 7. 什麼是由setTimeout調用的函數?
- 8. 什麼是setTimeOut()的JavaScript等效於Android?
- 9. 爲什麼可以使用的setTimeout( 「1」)
- 10. 爲什麼是錯
- 11. setTimeout返回什麼?
- 12. SQL Server 2000 - 什麼是「實際行數」?
- 13. 爲什麼setTimeout只執行一次?
- 14. 爲什麼AJAX settimeout不起作用?
- 15. 爲什麼setTimeout代碼被阻止?
- 16. 爲什麼requestAnimationFrame比setInterval或setTimeout更好
- 17. 爲什麼setTimeout回調會給我一個錯誤?
- 18. 爲什麼這是錯
- 19. 爲什麼我的Javascript setTimeout函數的行爲像一個setInterval?
- 20. 什麼是錯在我的代碼?爲什麼錯誤味精
- 21. 爲什麼Javascript將00的2位數年份評估爲1900而不是2000?
- 22. 爲什麼語言是不是裝的?我做錯了什麼?
- 23. 什麼是錯的
- 24. 爲什麼分配是錯誤的?
- 25. 在Javascript中,setTimeout中使用的變量的範圍是什麼?
- 26. jquery-mobile事件順序,爲什麼setTimeout將$ this設置爲undefined?
- 27. SQL server 2000中的這個操作數(* = star-equals)是什麼?
- 28. SQL 2000 MSDE安裝的建議setup.ini是什麼?
- 29. 是什麼觸發了SqlServer 2000中的緩存清除工作
- 30. 支持Windows 2000的普遍共識是什麼?
你已經找到了爲什麼w3schools不是一個很好的學習網站的幾個例子之一。有關更多信息,請參見http://w3fools.com/ – 2012-01-31 08:00:56