function foo(){
// ....
}
調用創建新Function object,並且受讓人命名foo
它。它仍然沒有被調用,只是被創建,所以任何return語句都不會被觸發。
當這個函數內部創建新Functions
,像
function foo(){
function bar() {
return 3;
}
return 4;
}
// after you execute foo
console.log(foo()); // will log 4
但非常重要的是,這個詞彙域內,功能bar
被創建,但沒有在那裏執行。又見Lexical scope
但是,當你有一個名爲bar
這個
function foo(){
function bar(){
return 3;
}
function bar() {
return 8;
}
return bar();
}
// after you execute foo
console.log(foo()); // will log 8
當你執行功能foo
內global
範圍,它創建函數對象,那麼它創建了一個名爲bar
新的函數對象,舊的被重新定義,與爲variable
分配新值相同,值更改,但在此上下文中,分配給函數名稱的函數體發生了更改。
因爲您的功能foo
有return
關鍵字,它會返回該值。它返回的值是返回函數bar
的值,因爲return bar();
將執行函數bar
並返回從函數bar
收到的值,例如它的值爲8。
比較變量的重新定義與功能的重新定義
var a;
a = "some string";
a = 5; // a has value 5, no mater older values
// same goes for functions
function bar(){ .... }
function bar(){ .... }
function bar(){ .... }
// invoke bar
bar(); // last function bar will be executed, no mater other function's bar definitions
從本質上講,你說:'X = 3'然後'X = 8'。那麼爲什麼你期待'x == 3'? – Johan
@Johan對不起,但沒有。它永遠不會說'x = 3'。第一個函數從未被調用,因爲它被第二個函數覆蓋。 – Archer
@Archer很好,'bar = 3'然後'bar = 8'然後'return bar' ...正是我所說的和上面寫的。 – Johan