预解析与函数变量声明提升

1、预解析:解析器会在代码执行之前进行预解析,在预解析的过程中,会对函数和变量的声明进行提升,注意:只提升声明,不提升赋值。在执行代码的时候才会进行赋值操作。

var a = 10;
fn();
function fn(){
    console.log(a);// undefined
    var a = 20;
}

上面代码的执行结果会输出undefined,因为虽然a已经在全局环境中进行了赋值,但是在函数作用域中,重新定义了一个a,并且只进行了变量的声明提升,还没进行赋值操作,所以输出undefined。

var a = 10;
fn(a);
function fn(a){
    console.log(a);// 10
    var a = 20;
}

如果把全局作用域中的a当做实参传入进去,会输出10,因为在预解析的时候,函数内a的值已经被赋值为10,然后才被重新赋值的。
2. 吐槽:在这里我只是简单的举了两个例子,由于预解析和函数作用域的关系,很容易让人迷惑,所以类似于这类的面试题层出不穷,仿佛JavaScript的重点都在这儿一样。如果你有兴趣又有时间,可以去网上找类似的题目看看。幸好ES6中对于变量提升和函数作用域进行了改进,这让开发变得更加的快捷方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值