Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 未捕获引用错误:未定义hello_Javascript - Fatal编程技术网

Javascript 未捕获引用错误:未定义hello

Javascript 未捕获引用错误:未定义hello,javascript,Javascript,知道我为什么会有错误未捕获引用错误:hello没有定义吗 function hello() { console.log('hello ()'); setTimeout("hello ()", 1000); } setTimeout("hello()", 1000);​ 这里有一个jsfiddle:在hello和()之间有一个空格 您确实不应该将参数作为字符串传递给setTimeout您在hello和()之间有一个空格 您确实不应该将参数作为字符串传递给setTimeout您不需

知道我为什么会有错误未捕获引用错误:hello没有定义吗

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

这里有一个jsfiddle:

hello
()
之间有一个空格


您确实不应该将参数作为字符串传递给
setTimeout

您在
hello
()
之间有一个空格

您确实不应该将参数作为字符串传递给
setTimeout

您不需要(也不应该)将函数名作为字符串引用

function hello() {
    console.log('hello');
    setTimeout(hello, 1000);
}
setTimeout(hello, 1000);
或者更好

setInterval(function() {
    console.log('hello');
}, 1000);
您不需要(也不应该)将函数名作为字符串引用

function hello() {
    console.log('hello');
    setTimeout(hello, 1000);
}
setTimeout(hello, 1000);
或者更好

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

演示中的JavaScript代码在
'load'
事件处理程序中运行(选择选项“onLoad”)。因此,函数
hello
不是全局函数。必须将选项设置为“无包裹(主体)”或“无包裹(头部)”。这样,您的JavaScript代码将是全局代码


实时演示:

演示中的JavaScript代码在
'load'
事件处理程序中运行(选择选项“onLoad”)。因此,函数
hello
不是全局函数。必须将选项设置为“无包裹(主体)”或“无包裹(头部)”。这样,您的JavaScript代码将是全局代码


实时演示:

问题在于,您正在将字符串传递给
setTimeout()
,这意味着字符串中的代码将被有效地
eval
ed,因此没有在您认为它正在运行的范围内运行,因此找不到
hello()
函数

如果您将左侧的JSFIDLE选项从“onload”更改为“no wrap”,它将按原样工作,因为该函数将是全局的,而不是嵌套在onload处理程序中,但更好的选择是将函数引用传递给
setTimeout()


(注意:
hello
后面没有括号)

问题是您正在将字符串传递给
setTimeout()
,这意味着字符串中的代码将被有效地
eval
ed,因此没有在您认为它正在运行的范围内运行,因此找不到
hello()
函数

如果您将左侧的JSFIDLE选项从“onload”更改为“no wrap”,它将按原样工作,因为该函数将是全局的,而不是嵌套在onload处理程序中,但更好的选择是将函数引用传递给
setTimeout()


(注意:
hello
后面没有括号)

我有:function hello(){…}这不是一个函数?不是问题,因为它从来没有走那么远。这个空格不会产生错误。标记之间可能会出现空格,代码仍然有效。我有:function hello(){…}这不是函数?不是问题,因为它从来没有走那么远。该空格不会产生错误。标记之间可能出现空格,代码仍然有效;为什么它对我不起作用?@Matthew为什么它不起作用在Daniel的回答中进行了解释,但是我陈述了另一种方法。@Matthew-传递字符串会影响代码运行的范围。请参阅Šime和我发布的答案。@Matthew出于同样的原因,应该避免将字符串传递给
setTimeout
。我见过许多使用函数名作为参数setTimeout('MyFunction()',1000)的字符串的示例;为什么它对我不起作用?@Matthew为什么它不起作用在Daniel的回答中进行了解释,但是我陈述了另一种方法。@Matthew-传递字符串会影响代码运行的范围。请参阅Šime和我发布的答案。@Matthew出于同样的原因,应该避免将字符串传递到
setTimeout
。将代码发布在此网站上,而不是其他网站上。链接应该是补充性的。将您的代码发布在此网站上,而不是其他网站上。链接应该是补充的。关于正在求值的字符串和作用域的最佳详细答案:-)关于正在求值的字符串和作用域的最佳详细答案:-)