JavaScript中的声明提升(Hoisting )

原文:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

JavaScript中存在一种声明提升的现象,这种现象的例子如下:

var foo = 1;
function bar() {
    if (!foo) {
        var foo = 10;
    }
    alert(foo);
}
bar();//1

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

原理:

由于变量提升,因此会在函数的最顶部进行变量和函数的声明,即声明提升。

举个例子来解释这种机制:

function foo() {
    if (false) {
        var x = 1;
    }
    return;
    var y = 1;
}

上述代码的执行过程其实如下:

function foo() {
    var x, y;
    if (false) {
        x = 1;
    }
    return;
    y = 1;
}

因此就造成了第一个例子中的现象。

另附声明提升的顺序:

1. 默认变量,例如this和arguments;

2. 函数的参数;

3. 函数的声明;

4. 变量的声明。

原文地址:https://www.cnblogs.com/dhuhank/p/4460539.html