js综合面试题
首先定义了一个叫Foo的函数,之后为Foo创建了一个叫getName的静态属性存储了一个匿名函数,之后为Foo的原型对象新创建了一个叫getName的匿名函数。之后又通过函数变量表达式创建了一个getName的函数,最后再声明一个叫getName函数。
function Foo() {
//注意这里没用let var const等命令,所以会被挂到window上
getName = function () { console.log(1); };
return this;
}
Foo.getName = function () { console.log(2); };
Foo.prototype.getName = function () { console.log(3); };
var getName = function () { console.log(4); };
function getName() { console.log(5); }
//运算符优先级 . > () > new
Foo.getName();//2--不解释
getName();//4--log5的函数声明提升,被log4的覆盖掉
Foo().getName();//1--Foo返回的this是window,window下面原本的getName为log4,但是因为Foo函数执行,又挂载了一个全局getName覆盖掉了log4,所以为1
getName();//1--因为getName被上一行代码修改为了1,所以为1
//考察运算符优先级
new Foo.getName();//2--new (Foo.getName)();
new Foo().getName();//3--(new Foo()).getName()
new new Foo().getName();//3--new ((new Foo()).getName)();