【发布时间】:2018-11-30 20:01:38
【问题描述】:
var foo = function bar(i) {
bar = "change bar reference";
if (i < 5) {
setTimeout(function () {
console.log(i);
bar(++i);
},
1000
);
}
}
上述函数没有错误。
var foo = function bar(i) {
var bar = "change bar reference";
if (i < 5) {
setTimeout(function () {
console.log(i);
bar(++i);
},
1000
);
}
}
将var添加到bar后第二个函数出错。
我希望这两个函数都抛出异常,而不仅仅是 var bar 的第二个函数。
我不明白为什么只有第二个函数抛出异常。
我知道var 的变量声明不会覆盖标识符“bar”,但赋值会在运行时完成。我理解为什么 var bar 是字符串而不是第二个函数上的函数,因此会引发异常。
为什么第一个函数不抛出异常? bar 明确分配给一个字符串。
我阅读了documentation 并在下面得到了一些可能有用的东西。
可以从 FunctionExpression 的 FunctionBody 内部引用 FunctionExpression 中的标识符,以允许函数递归调用自身。但是,与 FunctionDeclaration 不同,FunctionExpression 中的 Identifier 不能被引用,也不会影响包含 FunctionExpression 的范围。
“无法引用 FunctionExpression 中的标识符”是否意味着我不能在第一个函数中执行 bar = "change bar reference";?
JavaScript 脚本引擎在看到bar = "change bar reference" 时会做什么?是不是直接跳线?
编辑:未捕获的 TypeError:bar 不是函数
富(1)
【问题讨论】:
-
你得到的究竟是什么“异常”?
-
您正在将函数
bar更改为字符串,这就是您看到错误的原因。 -
第一个,您在全局范围内设置
bar,.. 但是您在本地范围内也有bar,这将首先看到.. 在第二个中,您创建了两个在本地范围内。如果您将第一个更改为window.bar,那么您所做的将变得更加明显。 -
@Pointy Uncaught TypeError: bar is not a function.
-
@Keith 我很确定第一个函数在全局范围内没有
bar。bar是命名函数表达式的标识符,只能在函数内部访问。这就是使问题变得有趣的原因。
标签: javascript