JS预解析是什么?

今天看了几道经典的面试题,其中有一道JS预解析的面试题,做错了,今天拿过来分析一下。

 var a = {n: 1}
  var b = a
  a.x = a = {n: 2}

  console.log(a.n, b.n) // ? ? 2 1
  console.log(a.x, b.x) // ? ?  underfined {n: 2}

在执行 a.x = a = {n: 2}中产生了疑问。

在JS预解析问题的处理过程中,需要注意以下几个方面:

1、预解析是什么?

2、赋值变量的执行顺序是什么?

第二个小问题不难,赋值变量一般从左向右进行。

第一个小问题,预解析:JS代码在执行之前,会对代码进行预解析,寻找作用域中的var 和function ,然后对其进行事先声明,在从上到下执行代码。这就是一个预解析的过程。

在下面这行代码中,JS从左向右进行了预解析处理,先运算 a.x = {n: 2},在运算 a = {n: 2}。

a.x = {n: 2}解析时候,由于a没有x这个属性,所以在堆内存中会开辟一块地址,专门设置x的属性.

运算 a = {n: 2},将a重新赋值,在堆中开辟了一块新的地址内存,此时a的地址指向了 {n: 2},

然后a与 {n: 1}切断关联,但是b的地址还是指向了原来的{n: 1},但是由于x的属性没有赋值,所以返回underfined。


总结

JS预解析的过程可以这样理解:

预解析就像是一场游戏,游戏开始之前先清点玩家参与的名单,只要你开黑加入了这场团战,那你就是游戏的参与者。无论你挂机还是不挂机,都是游戏的参与者。

underfined就好比挂机的。

报错找不到的就不是这场游戏的参与者。

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值