求大佬救命

function Fn() {
  say = function () {
    console.log(1);
  };
  return this;
}
Fn.say = () => {
  console.log(2);
};
Fn.prototype.say = () => {
  console.log(3);
};
var say = () => {
  console.log(5);
};
function say(paras) {
  console.log(4);
}
new Fn().say(); //new访问原型链 3
Fn.say(); //直接访问静态方法 2无疑
say();
/*
1 --要有Fn()才行:因为在默认情况下say是挂载在window下的,当执行Fn()时,赋值操作执行,进行了挂载,所以可以进行访问。还因为Fn()在var赋值操作后面,被覆盖了,故显示1,如Fn()在var前,则显示5
5 --无Fn():不执行Fn(),相当于没有了赋值操作,所以打印的时后面赋值的5
附:当出现相同名称时,优先级为:变量声明< 函数声明 < 变量赋值(NO.1)
*/ 
Fn().say(); //因为返回了this,相当于this.say() //1

//加上this.
function Fn() {
  this.say = function () {
    console.log(1);
  };
  return this;
}
new Fn().say(); 
//1 加上this后,say是挂载在Fn()的构造器上的,根据new的寻找规则,先构造器后原型,在原型链
Fn.say(); //2
say(); //5 因为没有在全局上挂载了,所以显示后面赋值的5
Fn().say(); //1

#学习路径#
全部评论
不是大佬,不过见过这种题,主要难点在 JS 运算符优先级上,更具体的说是点运算符(.)和 new 运算符(带参数列表和不带参数列表)的优先级问题,然后还有一个就是全局变量污染问题(函数中没用关键字申明变量)
点赞 回复 分享
发布于 2021-08-05 10:58

相关推荐

05-14 09:24
青岛工学院 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务