JavaScript范围和提升:代码按预期返回1而不是10

时间:2013-04-15 17:17:12

标签: javascript

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

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

正在运行的代码:http://jsfiddle.net/smMtU/

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

请有人指出这段代码背后的概念吗?

2 个答案:

答案 0 :(得分:7)

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

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

b内,您不是在更改外部a,而是在内部更改。{/ p>

答案 1 :(得分: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