这个简单的JavaScript脚本是如何工作的(可能涉及作用域)?

10

谁能为我分解一下这个(看起来一开始很简单)浏览器是如何解释它的:

var a = 1;
function b() {
    a = 10;
    function a() {}
}
b();
alert(a);

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

var a = 1;
function b() {
    a = 10;
    function m() {}
}
b();
alert(a);

它将会提示10


1
这个例子太常见了,你甚至可以把完整的代码放到你最喜欢的搜索引擎中,得到有用的结果... - Bergi
1个回答

13
使用var声明的变量作用域是定义它的整个函数,而不是从声明点开始。这经常被描述为变量声明提升,可以看作是所有变量声明移动到函数顶部的过程。对于函数定义来说,声明和“赋值”一起移动。
function b() {
    a = 10;
    function a() {}
}

等同于

function b() {
    var a  = function() {};
    a = 10;
}
这意味着你声明了一个新变量 aa = 10 语句只改变内部变量 a 而不是外部变量。我们称内部变量 a 遮盖了外部变量。
在第二种情况中,内部作用域没有变量 a,这意味着使用并更改外部变量(查找变量时,按照闭包链从内部作用域到最外部作用域)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接