2012-02-28 126 views
0

任何想法爲什麼我有錯誤未捕獲ReferenceError:你好沒有定義未捕獲ReferenceError:你好沒有定義

function hello() { 
    console.log('hello()'); 
    setTimeout("hello()", 1000); 
} 
setTimeout("hello()", 1000);​ 

這裏是一個的jsfiddle:http://jsfiddle.net/s9vLk/

+1

發佈您的代碼在這個網站,而不是在不同的網站。鏈接應該是補充的。 – 2012-02-28 02:04:04

回答

2

的問題是要傳遞字符串setTimeout()這意味着字符串中的代碼將有效地eval ED,因此未在範圍內運行,你認爲它的運行並因此找不到hello()函數。

如果將左側的jsfiddle選項從「onload」更改爲「no wrap」,則它的工作原樣,因爲該函數將是全局的,而不是嵌套在onload處理程序中,但更好的選擇是傳遞函數參考setTimeout()

function hello() { 
    console.log('hello()'); 
    setTimeout(hello, 1000); 
} 
setTimeout(hello, 1000); 

(注:hello後沒有括號)

+0

有關被評估的字符串和範圍的最佳答案:-) – Matthew 2012-02-28 02:07:02

0

你有hello()之間的空間。

你真的不應該將參數作爲字符串傳遞給setTimeout

+0

我有:function hello(){...} 這不是一個函數嗎? – Matthew 2012-02-28 01:58:03

+0

不是問題,因爲它從來沒有得到那麼多。 – Petah 2012-02-28 01:58:41

+1

該空間不會產生錯誤。代幣之間可能會出現空格,代碼仍然有效。 – 2012-02-28 02:06:34

0

您不需要(也不應該)需要將您的函數名稱作爲字符串引用。

function hello() { 
    console.log('hello'); 
    setTimeout(hello, 1000); 
} 
setTimeout(hello, 1000); 

或者更好的

setInterval(function() { 
    console.log('hello'); 
}, 1000); 
+0

我見過很多使用函數名稱作爲參數setTimeout('MyFunction()',1000)的字符串的示例; 爲什麼它不適合我? – Matthew 2012-02-28 02:00:51

+0

@Matthew爲什麼它不起作用在丹尼爾的回答中有解釋,但是我說的是另一種方法。 – Petah 2012-02-28 02:01:59

+0

@Matthew - 傳遞一個字符串會影響代碼運行的範圍。查看我和我發佈的答案。 – nnnnnn 2012-02-28 02:05:19

4

在您的演示中的JavaScript代碼'load'事件處理程序中運行(選擇該選項 「的onLoad」)。因此,函數hello不是全局函數。您必須將選項設置爲「無包裝(正文)」或「無包裝(正文)」。這樣,您的JavaScript代碼將成爲全局代碼。

現場演示:http://jsfiddle.net/s9vLk/1/

相關問題