2012-02-28 87 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/

相关问题