今天看了几道经典的面试题,其中有一道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就好比挂机的。
报错找不到的就不是这场游戏的参与者。