function Foo() {
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); }
Foo.getName(); //
getName(); //
Foo().getName(); //
getName(); //
new Foo.getName(); //
new Foo().getName(); //
代码如上,都可以复制到F12执行看下,等大佬作答,实在懵逼### 题目描述
把你上面的代码分为两部分:
先看
代码部分
:基于以下原因:
函数提升
和变量提升
函数提升
优先级高于变量提升
函数提升
不会被变量提升
的声明覆盖改造上面的代码:
然后再看
问题部分
:Foo.getName()
这个没有什么好说的,执行下面的代码:
所以输出
2
getName()
这个再看上面的代码,
getName
被赋值为function() { console.log(4); };
所以输出
4
Foo().getName()
这个分两部分:
Foo()
和.getName()
:执行这个代码之后,
getName
被重新赋值为function(){ console.log(1); }
,然后返回this
。这个
this
指的是谁?Foo()
函数调用,没有使用new
,所以这个this
指的是全局this
。所以现在这个代码变成了全局的
getName()
的调用,就是赋值的那个getName
的函数的调用。所以输出
1
getName()
这个现在跟【3】中的
getName
是一样的。所以输出
1
new Foo.getName()
这个写法比较迷惑人,转换一下,就是
new (Foo.getName)()
,什么意思呢,就是相当于:这样写是不是清楚一些,所以答案就清楚了。
输出
2
new Foo().getName()
这个比较简单,简单拆分一下吧:
obj
原型链上存在一个getName
函数,Foo.prototype.getName = function(){ console.log(3); };
所以输出
3
所以答案就是:
2
4
1
1
2
3