一道骚气的js题

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不是同一个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值