一條 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 (運算子優先序)的問題。

https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Operators/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。

--

--

A Programmer, Data Engineer

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store