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中测试过
甲命名函数表达式(不同于函数声明)创建了一个名字是唯一的功能的范围内提供.
表单的表达式(非声明)(function foo() { ... })创建一个名称foo 仅存在于函数内部的标识符.
因此,当您分配到foo函数内部时,您将分配此本地标识符.
如果将函数更改为函数声明,它将按预期工作:
var car = 'Blue';
function car () {
car = 'Red';
}
car();
console.log(car); //Logs 'Red'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1843 次 |
| 最近记录: |