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

Does the order of var in the javascript context matter?

本文关键字:是否 顺序 上下文 var javascript      更新时间:2023-09-26

也许这很愚蠢,但我真的对"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);

如有任何解释,不胜感激。

注释源;我假设这个代码是从全局范围开始的:

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. 嵌套作用域中的声明会隐藏(隐藏)包含范围中的声明。因此,outer中的local遮蔽全局,而inner中的local遮蔽outerlocal

  2. var声明是在执行进入执行上下文时处理的,而不是它们出现在源代码中的位置。它们有时被称为"被吊起",因为它们被有效地向上移动(升起、吊起)到了发生它们的环境的顶部。(更多:错误理解的var)这种影响在inner函数中特别明显,因为被警告的local是来自inner的,而不是来自outer的(这就是为什么它是undefined),即使声明在警告下面。

  3. 函数声明在定义它们的作用域中创建一个符号,与var声明位于相同的符号空间中。(具体而言,它们都在它们所在的执行上下文词法环境中创建条目。)。)因此,如果您有一个函数声明和一个具有相同名称的var(就像您在代码末尾使用a一样),就会发生冲突。哪一个获胜?函数声明获胜,因为规范的§10.5规定了顺序,其中规定函数声明发生在var声明之前,并且已经定义的符号的var不会覆盖它。