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();
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');
}
/// 1. ------------------------------------------------------------
// Foo.getName();运行时题目与解析为下: 故 打印 2
function Foo() {
getName = function () {
console.log('1');
};
return this;
}
// var getName;//变量提升 值不提升 但是和第五个函数同名 被覆盖
function getName() { //打印5的函数虽然被提升了 但是此时它相当于一个全局变量 而打印4的 getName函数将给打印5的getName函数重新赋值变成
console.log('4'); // 相当于(var a = 5, a = 4 可以这样理解)
}
Foo.getName = function () {
console.log('2');
};
Foo.prototype.getName = function () {
console.log('3');
};
// 2. ----------------------------------------
// Foo.getName();
// getName();运行到这个时 直接打印 4
//3 . ----------------------------------------
// Foo().getName(); 运行到这一行时 上面的函数会被解析成下:
function Foo() {
getName = function () { //此时打印1 的函数相当于隐式全局变量 给打印4 的函数从新赋值 变成现在这样
console.log('1');
};
return this;
}
function getName() {
console.log('1');
}
Foo.getName = function () {
console.log('2');
};
Foo.prototype.getName = function () {
console.log('3');
};
// Foo.getName();
// getName();
// Foo().getName(); 打印 1
// 4. ----------------------------------------
// Foo.getName();
// getName();
// Foo().getName();
// getName(); //运行到这一行直接打印 1
// 5. ----------------------------------------
// Foo.getName();
// getName();
// Foo().getName();
// getName();
// new Foo.getName(); //简单而言, . 的优先级高于 new ,所以第五问可以看成 new (Foo.getName)(); ,故结果为 2。
// 6. ----------------------------------------
// Foo.getName();
// getName();
// Foo().getName();
// getName();
// new Foo.getName();
// new Foo().getName(); // 可以看成 (new Foo()).getName() (也就是实例对象 可以访问 这个构造函数的prototype属性的任意成员) 故打印 3
// 7. ----------------------------------------
// Foo.getName();
// getName();
// Foo().getName();
// getName();
// new Foo.getName();
// new Foo().getName();
// new new Foo().getName(); // 可以看成 new ((new Foo()).getName)(); 打印 3