JavaScript

变量提升和函数提升

2020-08-12  本文已影响0人  埼玉的头发

提升 (Hosting)

js代码再执行在引擎会先进行预编译,预编译期间会将变量声明和函数声明提升到当前作用域最顶端

变量提升

//变量提升
console.log(a); //undefined
var a = 3;
console.log(a);//3
//函数表达式也可以理解为变量提升
console.log(fun);//undefined
var a = 'abc';
var fun = function(){
        console.log (a); //undefined
        var a;// 局部作用域中的a覆盖了全局变量中的a
}
fun();

函数声明式提升

//函数声明式提升
fun();  // 'hello',由此可见整个函数声明式被提到了顶部
function fun(){
    console.log('hello')
}

案例

var a = 1;
function foo() {
    a = 10;
    console.log(a);
    return;
    function a() {};
}
foo();
console.log(a);
这个案例,可能有人会第一眼看到会觉得a = 10,那不就是把全局变量改为10了吗?答案应该是10,10啊。我们仔细看,foo函数作用域末尾有一个函数声明式!它会被提升到函数作用域顶部,相当于声明了a变量,并为其赋值一个函数,所以此时的a变为了一个局部变量。
代码可拆分为
var a = 1;
function foo() {
    var a = function(){};
    a = 10;
    console.log(a); //10 局部变量a
    return;
}
foo();
console.log(a); // 1  全局变量a
上一篇 下一篇

猜你喜欢

热点阅读