经典面试题 Foo().getName() 解析
题目如下,写出输出内容(注释:abcde为步骤标号,便于下边分析定位)
// a.
function Foo () {
getName = function () {
console.log(1);
}
return this;
}
// b.
Foo.getName = function () {
console.log(2);
}
// c.
Foo.prototype.getName = function () {
console.log(3);
}
// d.
var getName = function () {
console.log(4);
}
// e.
function getName () {
console.log(5);
}
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();
解析:
1. Foo.getName(); // 2
Foo为一个函数对象,对象都可以有属性,题目 b 处定义Foo的getName属性为函数,输出2
2. getName(); // 4
这里看d、e处,d为函数表达式,e为函数声明,两者区别在于变量提升,这两处可以等价于
var getName = undefined;
// e处提升到顶部
getName = function () {
console.log(5);
}
...
// d. 重新赋值
getName = function () {
console.log(4);
}
// e.
...
可见函数声明的 5


2212

被折叠的 条评论
为什么被折叠?



