2 回答

TA貢獻1982條經驗 獲得超2個贊
這樣題目只能作為面試,生產環境沒有這么寫的。
當調用這個 Foo()
的時候,getName 成為全局變量,不使用 var
這樣的在嚴格模式是不允許的,另外在嚴格模式下函數內的this指向undefined的,非嚴格模式下就成了window
function Foo() { getName = function () { console.log(1); }; return this; }
var getName = function () { console.log(4); }; function getName() { console.log(5); }
這個就相當于
// 函數表達式提升比Function聲明提升少一級 function getName() { console.log(5); } // 這里就會重寫了 var getName; getName = function () { console.log(4); };

TA貢獻2016條經驗 獲得超9個贊
JS
在執行之前有一個編譯階段,在編譯階段主要:一、初始化用var
定義的變量為undefined
;二、初始化function
定義的函數。注意:兩種定義函數的方式在編譯階段初始化的結果是完全不同的,比如:
var greet = function(){}; // `greet` 初始化為 `undefined`
// 而
function greet(){} // `greet` 初始化為 函數
結合你的例子,實際上根據編譯及執行的過程,可以將代碼的順序調整為:
// 定義 1
function Foo() {
// 定義 7
getName = function() {
console.log(1);
};
return this;
}
// 定義 2
var getName = undefined;
// 定義 3
function getName() {
console.log(5);
}
// 定義 4
Foo.getName = function() {
console.log(2);
};
// 定義 5
Foo.prototype.getName = function() {
console.log(3);
};
// 定義 6
getName = function() {
console.log(4);
};
//請寫出以下輸出結果:
Foo.getName(); // 2 [定義 4]
getName(); // 4 [定義 6]
Foo().getName(); // 1 `Foo()`做了兩件事:
// 一:將`getName`從[定義 6]改變為[定義 7]
// 二:`return this`, `this`此時為`window`
// 所以`Foo().getName()`相當于`window.getName()`相當于`getName()`(注意,此時getName為[定義 7])
getName(); // 1 理由見上
new Foo.getName(); // 2 `new Foo.getName()`相當于`new (Foo.getName)()`,
// 而不是`(new Foo).getName()`, 這條語句將[定義 4]作為構造函數并執行
new Foo().getName(); // 3 `new Foo().getName()`相當于`(new Foo()).getName()`,
// 而不是`(new Foo().getName)()`, 這條語句執行了[定義 5]
new new Foo().getName();// 3 `new new Foo().getName()`相當于`new (new Foo().getName)()`,
// 這條語句將[定義 5]作為構造函數并執行
添加回答
舉報