JavaScript中的内部函数是否被提升?范围界定规则如何适用于他们?
我认为JavaScript没有块作用域,而是函数作用域,声明从块提升到父函数的顶部 但是,以下代码无法按预期工作:JavaScript中的内部函数是否被提升?范围界定规则如何适用于他们?,javascript,function,scope,declaration,hoisting,Javascript,Function,Scope,Declaration,Hoisting,我认为JavaScript没有块作用域,而是函数作用域,声明从块提升到父函数的顶部 但是,以下代码无法按预期工作: function one(a) { console.log("one called for " + a); if (a == 1) { function inner(b) { console.log("inner called for " + b); } inner(123); }
function one(a) {
console.log("one called for " + a);
if (a == 1) {
function inner(b) {
console.log("inner called for " + b);
}
inner(123);
}
inner(456);
}
one(1);
one(2);
one(3);
第一个1代码>调用正常进行,没有任何错误,但是当第二个1(2)时,执行停止代码>被调用
这种行为是直观的:只有当a==1
时才定义函数internal
但如何与范围界定/吊装规则保持一致?
我原以为它的定义会被提升到它的范围的顶部,超出了if
块的范围,而该块应该没有效果
编辑:以下是我收到的错误:
浏览器是Firefox 内部
的声明被提升到外部功能的顶部。但是,它的值仅在a==1
时设置
当使用不同的值调用outer()
时,调用internal(456)
失败,因为internal
仍设置为undefined
是无效的ECMAScript。函数声明必须位于函数或程序体的顶层,位于块内部。Firefox确实有条件地执行这个函数语句,其他浏览器也会像正常的函数声明一样执行它。将其移到if语句之外,或指定一个函数表达式。对我有用-@MarkWalters再看看控制台。有错误。@MarkWalters:使这个问题变得更有趣:我发现了另一个问题,这可能会有所启发-你有+1 Google Fu。函数声明必须在函数或程序体的顶层-但你发布的示例不是“在函数的顶层”吗?不,它在if体块内
if (…) {
function …() {
…
}
}