这个简单的javascript脚本实际上是如何工作的(可能是范围界定的)?

How this simple javascript script actually works (might be scoping)?

本问题已经有最佳答案,请猛点这里访问。

有没有人能为我分步介绍浏览器如何解释这一点(一开始看起来很简单):

1
2
3
4
5
6
7
var a = 1;
function b() {
    a = 10;
    function a() {}
}
b();
alert(a);

它将带来1。如果我要将函数名更改为其他任何名称等:

1
2
3
4
5
6
7
var a = 1;
function b() {
    a = 10;
    function m() {}
}
b();
alert(a);

它将提醒10


var声明的变量的范围是声明变量的整个函数,它不是从声明点开始的。它通常被描述为变量声明提升,可以看作是所有变量声明都移到函数的开头。对于函数定义,声明和"赋值"一起移动。

1
2
3
4
function b() {
    a = 10;
    function a() {}
}

等于

1
2
3
4
function b() {
    var a  = function() {};
    a = 10;
}

这意味着您声明了一个新的变量a,而a = 10语句只更改了内部变量a,而不是外部变量。我们说内部变量a隐藏了外部变量。

在第二种情况下,内部作用域中没有变量a,这意味着使用和更改了外部作用域(在查找变量时,从内部作用域转到闭合链之后的最外部作用域)。