面试题
1 | function Foo() { |
分析结果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