Fork me on GitHub

经典面试题解析

面试题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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()
new new Foo().getName()

分析结果1

访问对象的静态属性,输出是:2

分析结果2

存在两点:(1)变量提升;(2)函数优先
所以代码的结构是:

1
2
3
4
5
6
7
8
9
10

function Foo() {
getName = function () { console.log(1) }
return this
}
var getName;
function getName() { console.log(5)}
Foo.getName = function () { console.log(2)}
Foo.prototype.getName = function () { console.log(3)}
getName = function () { console.log(4)}

最终结果就是: 4

分析结果3

Foo()调用之后返回的结果this(指向的是window),之后window.getName()向上查找作用域,发现有全局的作用域window.getName(),所以最终的结果是:1

分析结果4

第三问中getName的结果已经修改了,所以还是1

分析结果5

考察的是运算符优先级,这里new运算符没有带有参数,所以优先执行Foo.getName,然后()优先级大于new,得到Foo.getName() = 2,于是最终结果是2

分析结果6

new运算符带有参数,所以new Foo()优先于函数调用,得到一个新的对象,但是这个对象没有直接的getName属性,就查找原型链中的,所以得到结果是3

分析结果7

  • 优先级: new Foo() > 函数调用 > new 不带参数
  • new Foo() 执行得到一个新的对象
  • newObject.getName() 对象自身没有这个属性,就委托原型链,得到3
  • new 3 没有返回值还是3

2 4 1 1 2 3 3

-------------本文结束感谢您的阅读-------------