1

我是 JavaScript 的新手,我真的不太明白为什么下面的代码返回1而不是10

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

运行代码:http: //jsfiddle.net/smMtU/

如果我 rem line function a() {},它会10按预期返回。这段代码来自这篇文章,用于解释JavaScript 中的作用域和提升概念。也许我在阅读这篇文章时遗漏了一些东西?

请任何人都可以指出此代码背后的概念吗?

4

2 回答 2

7

由于吊装,您的代码相当于

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

在内部b,您不是在更改外部a,而是在更改内部。

于 2013-04-15T17:19:06.257 回答
0

a此声明在执行之前为当前作用域中的函数创建一个作用域。

function b调用并执行下面的这一行时

a = 10;

a函数内部已经创建了一个范围b

所以这变得等价:

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

对此:

var a = 1;
function b() {
    var a = function(){}; //scope created before

    a = 10; //'a' already exists in local scope, just replace it.
    return;
}
b();
alert(a); // global 'a' remains intact
于 2013-04-15T17:50:03.200 回答