JS中的声明提升

转载自这里
var 声明的变量会在任意代码执行前处理,这意味着在任意地方声明变量都等同于在顶部声明——即声明提升。
在JavaScript中,一个变量名进入作用域的方式有 4 种:

1.Language-defined:所有的作用域默认都会给出 this 和 arguments 两个变量名(global没有arguments);
2.Formal parameters(形参):函数有形参,形参会添加到函数的作用域中;
3.Function declarations(函数声明):如 function foo() {};
4.Variable declarations(变量声明):如 var foo,包括_函数表达式_。
函数声明和变量声明总是会被移动(即hoist)到它们所在的作用域的顶部(这对你是透明的)。

而变量的解析顺序(优先级),与变量进入作用域的4种方式的顺序一致。

一个超详细的例子:

function testOrder(arg) {
    console.log(arg); // arg是形参,不会被重新定义
    console.log(a); // 因为函数声明比变量声明优先级高,所以这里a是函数
    var arg = 'hello'; // var arg;变量声明被忽略, arg = 'hello'被执行
    var a = 10; // var a;被忽视; a = 10被执行,a变成number
    function a() {
        console.log('fun');
    } // 被提升到作用域顶部
    console.log(a); // 输出10
    console.log(arg); // 输出hello
}; 
testOrder('hi');
/* 输出:
hi 
function a() {
        console.log('fun');
    }
10 
hello 
*/

猜你喜欢

转载自blog.csdn.net/qq_37002901/article/details/89278685