[英]Do inner functions in JavaScript get hoisted? How do the scoping rules apply to them?
我以为JavaScript没有块范围,而是函数范围,并且声明从其块提升到了父函数的顶部。
但是,以下代码无法正常工作:
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);
第one(1);
调用正常进行,没有任何错误,但是在第二one(2);
时执行停止one(2);
叫做。
此行为很直观:仅当a==1
时才定义函数inner
。
但是,它与范围/吊装规则如何一致?
我认为它的定义将被提升到它的作用域的顶部,在应该没有作用的if
块之外!
编辑:这是我得到的错误:
浏览器是Firefox。 在这里摆弄。
if (…) { function …() { … } }
无效的ECMAScript。 函数声明必须在函数或程序主体的顶层,在块内部, 其行为取决于实现 。 Firefox确实有条件地执行此函数语句 ,其他浏览器确实像常规函数声明那样提升它。 将其移至if语句之外,或分配一个函数表达式。
inner
的声明被提升到外部函数的顶部。 但是,仅当a == 1
时才设置其值。
当outer()
被调用一个不同的值,调用inner(456)
失败作为inner
仍然被设置为undefined
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.