JS 之操作符优先级

写这篇博客的原由是因为昨日的凡科笔试遇到了类似的题目。

现在就来看看这道题目,首先正如注释写的那样,因为存在函数提升所以第一个getval()的输出就是5,接着调用f.getval这个函数输出2,

f().getval()这一步的理解是比较重要的:

第一步:先执行f函数内的代码;因为f函数里的getval没有用var等声明,所以getval变为了全局的函数而不是f函数的私有成员,接着返回this=》即window对象;

第二步:这时f().getval()变成了window.getval();所以输出day为1

 第二个getval的调用:参照上面故也输出1;

new f.getval():因为成员访问'.'的优先级比new高,所以先执行foo.getName,在来执行new,可看成=》new (f.getval) (),new返回f.getval的实例,输出2;

new f().getval():这里主要犹豫的时先执行f()还是new,因为此时new是带参数的,所以先new,=》(new f()).getval,即调用的是f()上的getval,因为在f()里没找到自己的getval,所以去原型上找,输出为3

new new f().getval():  由上面就可以知道带参数的new会优先执行故:

第一步:new( new f().getval)()

第二步:new( ( new f() ).getval)()

先计算new foo(), 在获取getName,在对获取内容进行new ()计算,再进行调用;

也就是new( ( new f() ).getval)() =》new(f.prototype.getval)(),故输出为3.

参考文章:https://www.jianshu.com/p/412ccd8c386e

猜你喜欢

转载自www.cnblogs.com/ruilin/p/11695954.html
今日推荐