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

Bjo*_*orn 5 javascript

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.
Run Code Online (Sandbox Code Playgroud)

何时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.
Run Code Online (Sandbox Code Playgroud)

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

var car = 'Blue';
(function car () {
 car = 'Red';
})();
console.log(car); //Logs 'Blue'????
Run Code Online (Sandbox Code Playgroud)

有人能解释一下吗?我没有看到在ECMASpec中解释的位置.在Chrome 8和Firefox 3.6中测试过

SLa*_*aks 6

命名函数表达式(不同于函数声明)创建了一个名字是唯一的功能的范围内提供.

表单的表达式(非声明)(function foo() { ... })创建一个名称foo 仅存在于函数内部的标识符.
因此,当您分配到foo函数内部时,您将分配此本地标识符.

如果将函数更改为函数声明,它将按预期工作:

var car = 'Blue';
function car () {
    car = 'Red';
}
car();
console.log(car); //Logs 'Red'
Run Code Online (Sandbox Code Playgroud)