Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中的内部函数是否被提升?范围界定规则如何适用于他们?_Javascript_Function_Scope_Declaration_Hoisting - Fatal编程技术网

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); }

我认为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);
第一个
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 …() {            
        …
    }
}