2012-11-10 61 views
5

我不明白什麼是錯的。我有三個代碼:
第一:函數內部的setInterval產生一個錯誤:變量未定義

<script language="JavaScript" type="text/javascript"> 
    var count = 0; 
    alert(count); 
    var timer = setInterval("count = count + 1; alert(count);",10000); 
</script> 



二:

<script language="JavaScript" type="text/javascript"> 
    function countdown() 
    { 
    var count = 0; 
    alert(count); 
    var timer = setInterval("count = count + 1; alert(count);",10000); 
    } 
    countdown(); 
</script> 



三:

<script language="JavaScript" type="text/javascript"> 
    var count = 0; 
    function countdown() 
    { 
    alert(count); 
    var timer = setInterval("count = count + 1; alert(count);",10000); 
    } 
    countdown(); 
</script> 



第一個代碼工作正常,第二個產生「setInterval」行錯誤: 「count is not defined」,第三個代碼再次正常工作。第二個代碼中的「count」變量的作用域應該是全局的,以用於setInterval函數。爲什麼不是?我正在使用Mozilla Firefox。 謝謝。

+0

你剛剛發現你不應該使用字符串作爲setInterval/setTimeout的回調的原因之一。看看右邊的相關問題,我敢打賭,其中一半有同樣的問題。 – Yoshi

回答

8

由於很多原因,其中一個您剛剛碰到,從未有過將字符串傳遞給setTimeoutsetInterval。永遠。我是認真的。從來沒有一個很好的理由。

改爲傳遞函數。傳遞函數對象的能力是JS最好的特性之一。

var count = 0; 
alert(count); 

var timer = setInterval(function(){ 
    count = count + 1; 
    alert(count); 
}, 10000); 

您面臨的問題是,以這種方式作爲字符串的代碼將不尊重範圍。它將在全局範圍內執行,這是您的第二個和第三個片段中不存在的變量。而第一個片段的作品,因爲count確實是一個全局變量。

其他問題源於這個事實,這基本上是eval,它帶有自己的頭痛,最好完全避免。畢竟,畢竟是Eval is Evil

+0

嗨,亞歷克斯韋恩!謝謝您的幫助。我不明白爲什麼字符串是如此糟糕,但我會嘗試按照您提供的鏈接。奇怪的是,這個問題沒有涵蓋在我讀過的書籍中。 – GreenBear

+0

簡而言之,這很糟糕,因爲它很慢並且有潛在危險(就像eval一樣),它的表現方式並不是你期望的。所有這些東西都通過使用實際的實際功能來解決。 –