返回信息流```js
function Foo() {
getName = function() { alert (1); };
return this;
}
Foo.getName = function() { alert (2);};
Foo.prototype.getName = function() { alert (3);};
var getName = function() { alert (4);};
function getName() { alert (5);}
//请写出以下输出结果:
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();
```
这是一条镜像帖。来源:北邮人论坛 / java-script / #1228同步于 2017/1/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
JavaScript机器人发帖
看到个有意思的 JavaScript 基础题~测测看吧...
stevesasuke
2017/1/17镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
```
function Foo() {
getName = function() { alert (1); };
return this;
}
Foo.getName = function() { alert (2);};
Foo.prototype.getName = function() { alert (3);};
var getName = function() { alert (4);};
function getName() { alert (5);}
//请写出以下输出结果:
Foo.getName(); //2
getName(); // 4
Foo().getName(); // 1
getName(); // 1
new Foo.getName(); // 2
new Foo().getName(); // 3
new new Foo().getName(); // 3
```
// 调用 声明 声明赋值
var print = console.log.bind(null);
var printLine = function() {
console.log.call(null, '--------------------');
};
// -----------------util above-----------------
print(a(), a);
var a = function() {return 2;};
function a() {return 1;}
printLine();
var b = function() {return 2;};
print(b(), b);
function b() {return 1;}
printLine();
var c = function() {return 2;};
function c() {return 1;}
print(c(), c);
printLine();
print(d(), d);
function d() {return 1;}
var d = function() {return 2;};
printLine();
function e() {return 1;}
print(e(), e);
var e = function() {return 2;};
printLine();
function f() {return 1;}
var f = function() {return 2;};
print(f(), f);
printLine();
function Foo() {
getName = function() { alert (1); }; // # 4
return this; // #3
}
Foo.getName = function() { alert (2);}; // #5
Foo.prototype.getName = function() { alert (3);}; // #6
var getName = function() { alert (4);}; // #2
function getName() { alert (5);} // #1
// 请写出以下输出结果:
Foo.getName(); // 2 不解释
getName(); // 4 #1 函数声明提升(hoisting)至顶端,导致被悲惨 #2 覆盖
Foo().getName(); // 1 #3 的 this 是 window,同时 `Foo()` 执行导致 getName 被再次覆盖为 #4 定义的 getName
getName(); // 1 `Foo()` 执行导致 getName 被再次覆盖为 #4 定义的 getName
// 以下是优先级搞的把戏
new Foo.getName(); // 2 优先级:成员操作符 > new,所以等价于 `new (Foo.getName)()`` #5 函数被执行
new Foo().getName(); // 3 等价于 `(new Foo()).getName()` #6 函数被执行
new new Foo().getName(); // 3 等价于 `new ((new Foo()).getName())` #6 函数被执行
生产不应该出现如此模棱两可的代码,上面测试感觉在考智力题,汗!?
参考:
注意优先级 new () > Function Call > new
- [JavaScript Operator Precedence](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)