Javascript 未捕获引用错误:未定义hello
知道我为什么会有错误未捕获引用错误:hello没有定义吗Javascript 未捕获引用错误:未定义hello,javascript,Javascript,知道我为什么会有错误未捕获引用错误: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);
这里有一个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
。将代码发布在此网站上,而不是其他网站上。链接应该是补充性的。将您的代码发布在此网站上,而不是其他网站上。链接应该是补充的。关于正在求值的字符串和作用域的最佳详细答案:-)关于正在求值的字符串和作用域的最佳详细答案:-)