代码之家  ›  专栏  ›  技术社区  ›  Bjorn

如果不用var声明全局变量或它不是参数,为什么在某个函数的某些情况下该全局变量没有被更改?

  •  5
  • Bjorn  · 技术社区  · 14 年前

    ecmascript非常简单 var . 如果你不使用 var 在函数内部声明分配给全局范围的变量。这是因为链范围界定的工作方式。执行环境在本地作用域中查找标识符,然后向上移动,直到到达全局作用域。如果没有找到标识符的声明,并且没有将其标识为参数,则在全局范围内创建变量。

    例如,本地范围:

    var car = 'Blue';
    
    function change_color () {
      var car = 'Red';
    } 
    change_color();
    console.log(car); //logs 'Blue' as car is in the local scope of the function.
    

    什么时候? car 在本地作用域中找不到:

    var car = 'Blue';
    function change_color () {
      car = 'Red';
    }
    change_color();
    console.log(car); 
    //logs 'Red' as car is not in the local scope and the global variable is used.
    

    显然,这条规则有一个例外我不知道也不理解( 注意函数名 ):

    var car = 'Blue';
    (function car () {
     car = 'Red';
    })();
    console.log(car); //Logs 'Blue'????
    

    有人能解释一下吗?我不知道这在Ecmaspec中的解释。在Chrome8和火狐3.6中测试

    1 回复  |  直到 14 年前
        1
  •  6
  •   SLaks    14 年前

    named function expression

    (function foo() { ... }) foo

    var car = 'Blue';
    function car () {
        car = 'Red';
    }
    car();
    console.log(car); //Logs 'Red'