繁体   English   中英

JavaScript中的内部函数是否被吊起? 作用域规则如何应用于它们?

[英]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控制台的屏幕截图

浏览器是Firefox。 在这里摆弄。

 if (…) { function …() { … } } 

无效的ECMAScript。 函数声明必须在函数或程序主体的顶层,在块内部, 其行为取决于实现 Firefox确实有条件地执行此函数语句 ,其他浏览器确实像常规函数声明那样提升它。 将其移至if语句之外,或分配一个函数表达式。

inner的声明被提升到外部函数的顶部。 但是,仅当a == 1时才设置其值。

outer()被调用一个不同的值,调用inner(456)失败作为inner仍然被设置为undefined

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM