我遇到了一个有趣的quiz

function bar() {
    return foo;
    foo = 10;
    function foo() {}
    var foo = '11';
}
alert(typeof bar());


我的解释是这样的(根据控制台,这是错误的:)):

var foo; // global variable
function bar(){
    function foo(){}
    var foo;  //  Here variable foo should override foo function
    return foo; // (according to me foo should be variable with undefined value) What is going on here, How JavaScript resolve naming order ?
    foo = 10;
    foo = "11";
}


这是我正在阅读的参考书this


  在JavaScript中,名称通过以下四种基本方式之一进入范围:
   1.Language-defined:默认情况下,所有作用域均使用名称this和arguments。
   2.形式参数:函数可以具有命名形式参数,其范围仅限于该函数的主体。
   3.函数声明:这些函数的形式为foo(){}。
   4.变量声明:这些变量声明采用var foo;的形式。


他后来引用:


  要记住的最重要的特殊情况是名称解析顺序。请记住,名称输入给定范围的方式有四种。我在上面列出的顺序是它们解决的顺序。通常,如果已经定义了名称,则永远不会被同名的另一个属性覆盖。这意味着函数声明优先于变量声明。这并不意味着对该名称的分配将不起作用,只是声明部分将被忽略。


这让我感到困惑,任何人都可以参考上面的示例来简化它吗?
我想知道的要点:


如何在函数内没有var的变量进行提升?
提升过程中是否发生变量超控?

最佳答案

让我们暂时保留功能foo。在函数内,如果在函数内的任何地方声明了变量,则声明将移至函数的顶部。所以实际上是这样评估的

function bar() {
    var foo;
    return foo;
    foo = 10;
    foo = '11';
}


但是,当您使用相同的名称声明函数时,它将具有优先权,并且其计算结果与此类似

function bar() {
    var foo = function() {};
    return foo;
    foo = 10;
    foo = '11';
}


这就是为什么您在警报框中得到function的原因。

关于javascript - 提升名称解析顺序在JavaScript中如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25988531/

10-12 06:56
查看更多