一條 JavaScript 面試題目
答案:
WHY??
Q1: Foo.getName() 是 2 的原因是這是在 call Object Foo 的 getName() method。而只有 Foo.getName = function() { alert(2); }; 是在設定 Foo的 static method getName。
Q2: getName() 為什麼是 4 不是 5 呢? 原因是在於 Function Declaration 和 Function Expression 的運行次序問題。
// Function Expression
var getName = function() { ... }// Function Declaration
function getName() { ... }
Function Declaration 會在任何 code 被執行前讀取而 Function Expression 只會在執 那一行 code 時才被讀取。所以就算它們在寫的時候,次序是前後相反的,但最也會是先執行Declaration再是Expression的code。
Q3: 看似很簡單直接但它和 Q4 是有很大的關係。
function Foo() {
getName = function() { console.log(1); };
return this;
}
首先 function 的 getName 是沒有 var 在前面的,所以它是一個 Global Variable。而 Foo() 其實是由 Object window invokes 的。Foo() 會 return this 這個 this 是指 window。
Foo()
||
window.Foo()window.Foo().getName()
||
window.getName()
Foo() 被 invokes 的時候 global variable getName 由 'console.log(4)' 改變為 'console.log(1)'。
Q4: 由 Q3 將 getName 改變了,所以是 1 。
Q5 - Q7: 都是 Operator precedence (運算子優先序)的問題。
new Foo.getName(); => new (Foo.getName)();
new Foo().getName(); => (new (Foo())).getName();
new new Foo().getName(); => new ((new Foo()).getName)();
new Foo() 會產生一個 Foo object,而新的 Foo object 沒有 define getName() 因此它會用 prototype.getName()。所以是 3。