function a(xx) {this.x = xx; return this}
var x = a(5);
var y = a(6);
console.log(x.x);
console.log(y.x);
直切主题,看上面的代码,最后的输出是什么?
先不急,我们一步一步分析:
首先预编译的环节之后:x=undefined, y = undefined, a = function(xx){this.x = xx; return this};
接着执行 a(5)
因为默认情况下function里的this指向window(非严格模式下)所以函数里的执行可以等效为 window.x = 5; return window
接着就赋值给 x = window, 到这里x是window相信大家都知道,那么x.x是什么呢?? 由同学可能会大喊一声,是5,确实很有迷惑性,我相信很多人都会说是5,我们仔细分析一下,x.x等价于window.x.x(在全局的条件下) ,那么window.x不就等价于x吗,也就是说x是window,window.x也是window,所以x.x就等价于window.x === window,我们在控制台检测一下是不是这个答案
可见确实如同我们所见的一样
接下来,执行a(6),把this.x 变为6,y赋值为window,经过上面的分析,我们因该明白现在的x是6,x.x是undefined,有人可能会说不对呀,x是原始值,怎么会有属性呢?这里涉及到包装类,在执行x.x的时候,引擎会自动把x转换成对象,因为没有x这个属性,所以输出undefined
所以上述的结果就是undefined 6
看下控制台是否 一样呢?
接下来我们在折腾一下,
var x = a(5) => let x = a(5)
var y = a(6) => let y = a(6)
把变量声明换成let,看下结果
输出变为了6,6这和上面的结果不一样了
原因是let 声明的变量不属于window了,所以windiw.x和let声明的x不是同一个