javascript上下文中var的顺序是否重要?

时间:2013-07-15 06:41:38

标签: javascript function

也许这很愚蠢,但我真的对'var'关键字感到沮丧。我无法弄清楚以下问题:

var local = true;
function outer() {
    /* local scope */
    var local = false;
    function inner() {
      alert(local);
      var local;
    }
    inner();
}
outer();

function a(x) {
    return x * 2;
}
var a;
alert(a);

感谢任何解释。

1 个答案:

答案 0 :(得分:2)

带注释的来源;我假设这段代码从全局范围开始:

var local = true;      // Creates a global variable called `local`
function outer() {
    /* local scope */
    var local = false; // Creates a local `local` within `outer`, shadowing (hiding) the global
    function inner() {
      alert(local);    // alerts "undefined", the value of `inner`'s `local`
      var local;       // Creates a local `local` within `inner`, shadowing (hiding) `outer`'s version
    }
    inner();
}
outer();

function a(x) {        // Creates a global function `a`
    return x * 2;
}
var a;                 // Has no effect
alert(a);              // alerts the function source (on engines that have it)

上面的代码基本上有三件事情可以解决:

  1. 嵌套作用域中的声明在包含作用域中隐藏(隐藏)声明。因此,local中的outer会影响全局,local隐藏inner阴影outer的{​​{1}}。

  2. local声明在执行进入执行上下文时被处理,它们出现在源代码中。它们有时被称为“悬挂”,因为它们被有效地向上移动(抬起,悬挂)到它们发生的上下文的顶部。 (更多:Poor misunderstood var)此效果在var函数中尤为明显,因为被提醒的inner是来自local的{​​1}},而不是来自inner的{​​{1}} }(这就是为什么它是outer),即使声明在警报下面。

  3. 函数声明在与undefined声明相同的符号空间中,在定义它们的作用域中创建符号。 (具体来说,它们都在执行上下文词汇环境绑定对象中创建条目。)所以如果你有函数声明和var具有相同的名称(与代码末尾的var一样),存在冲突。哪个胜利?函数声明胜出,因为§10.5 of the specification指示的顺序表示函数声明发生在a声明之前,并且已定义的符号的var不会覆盖它