第64题 函数执行 说出结果并说出why
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()
这道题其实就是看你对作用域的关系的理解吧
执行结果:
- 执行 Foo.getName() , 执行
Foo函数对象上的的静态方法。打印出2 - 执行 getName() , 就是执行的
getName变量的函数。打印4- 为什么这里是 执行的 变量
getName,而不是函数getName呢。这得归功于js的预编译 - js在执行之前进行预编译,会进行
函数提升和变量提升 - 所以函数和变量都进行提升了,但是
函数声明的优先级最高,会被提升至当前作用域最顶端 - 当在执行到后面的时候会导致
getName被重新赋值,就会把执行结果为4的这个函数赋值给变量
- 为什么这里是 执行的 变量
- 执行 Foo().getName() , 调用
Foo执行后返回值上的getName方法。Foo函数执行了,里面会给外面的getName函数重新赋值,并返回了this。 也就是执行了this.getName。所以打印出了1 - 执行 getName() , 由于上一步,函数被重新赋值。所以这次的结果和上次的结果是一样的,还是为
1 - 执行 new Foo.getName() , 这个
new其实就是new了Foo上面的静态方法getName所以是2。 当然如果你们在这个函数里面打印this的话,会发现指向的是一个新对象 也就是new出来的一个新对象- 可以把
Foo.getName()看成一个整体,因为这里 . 的优先级比 new 高
- 可以把
- 执行 new Foo().getName() ,这里函数执行
new Foo()会返回一个对象,然后调用这个对象原型上的getName方法, 所以结果是3 - 执行 new new Foo().getName() , 这个和上一次的结果是一样,上一个函数调用后并咩有返回值,所以在进行
new的时候也没有意义了。 最终结果也是3
