js变量提升

189 阅读2分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」。

变量提升

在我们日常习惯中,通常是直接给变量定义赋值的(var a = 0),但是有些时候我们使用同样的变量名时,会出现由作用域覆盖以及变量提升的情况,会很容易出错

什么是变量提升呢,其实很简单,像var a='1'; var b='2'; 其实是这样编译的var a, b; a='1'; b='2'; 将变量提升到作用域的顶端

注意只有 var 有变量提升

a = 1;
var a = 2;
console.log(a);

上面的代码运行后, a提升后,先后赋值为1和2, 最后输出结果为2

同样的代码使用 let 就会报错

a = 1;
let a = 2;
console.log(a);

image.png

看一下这段代码,它的输出结果是 undefined 是因为在输出语句前变量提升了但是没有进行赋值。

console.log(a);
a = 1;
var a = 2;

看这段代码,它的输出结果是, 1、1 js中定义的全局变量会自动挂在window下,全局变量window下的变量区别是 全局变量是不能通过delete操作符删除的,而直接定义在window上的属性是可以删除的。

a = 1;
console.log(a);
console.log(window.a);

函数提升与变量提升

#函数优先提升会先于变量提升**

console.log (foo);
var foo = '变量';
console. log(foo);
function foo(){
    console.log('函数');
}

这段代码看上去是先定义的foo变量后定义的foo函数,但变量提升后,foo函数先被定义,所以第一个输出的foo是函数,我们手动提升一下,就很容易看懂了

function foo(){
    console.log('函数');
}
var foo;
console.log (foo);
foo = '变量';
console. log(foo);

image.png

测试题

那我们来看一下这段代码会怎样输出

        function test(a,b){
            console.log(a);
            console.log(b);
            var b = 234;
            console.log(b);
            a = 123;
            console.log(a);
            function a(){};
            var a ;
            b = 234;
            var b = function(){};
            console.log(a);
            console.log(b);
        }
        test(1)

test函数中有两个参数,但是我们只传递了一个,所以test的初始状态是 a=1, b=undefined

首先由于函数优先提升会先于变量提升,我们先把 function a(){}; 提升到最顶部,然后把var b 和 a提升,这里注意 b = function(){}; b是变量哦。 把这里做好后,逻辑已经很清晰了,剩下就是给a和b重新赋值的操作了

        function test(a,b){
            function a(){};
            var b ;
            var a ;
            console.log(a);
            console.log(b);
            b = 234;
            console.log(b);
            a = 123;
            console.log(a);
            b = 234;
            b = function(){};
            console.log(a);
            console.log(b);
        }

image.png

你学会了嘛⛷⛷⛷