JavaScript 中函數定義的差異問題

[javascript]
try { 
    fun1(); 
} catch(e) { 
    alert(e); 
}; 
 
try { 
    fun2(); 
} catch(e) { 
    alert(e); 
}; 
 
function fun1() { 
    alert("this is fun1."); 

 
var fun2 = function() { 
    alert("this is fun2."); 

 
try { 
    fun2(); 
} catch(e) { 
    alert(e); 
}; 
try {
 fun1();
} catch(e) {
 alert(e);
};

try {
 fun2();
} catch(e) {
 alert(e);
};

function fun1() {
 alert("this is fun1.");
}

var fun2 = function() {
 alert("this is fun2.");
}

try {
 fun2();
} catch(e) {
 alert(e);
};
因為這樣的寫法更有助於區別函數的定義和一般變量的定義.

 

但這樣的寫法,

[javascript]
function fun1() { 
    alert("this is fun1."); 

function fun1() {
 alert("this is fun1.");
}

當這個function的語句在解析時會發生被提升的情況.( 加粗部分出自<JavaScript語言精粹>)

這就是意味著,用此方法無論在哪裡定義的函數,都會被移動到定義時所在作用域的頂層.

也就是說,在定義的作用域內都可以調用該函數,這就不符合"先定義後調用"的理念.

這樣會影響代碼可讀性和帶來一些混亂,所以在編碼時更應該註意"先定義後調用".

 

而下面的代碼,則解決瞭上面所提及的問題.

[javascript]
var fun2 = function() { 
    alert("this is fun2."); 

var fun2 = function() {
 alert("this is fun2.");
}

函數fun2的調用必須在函數的定義之後,不然會拋出錯誤.

因為這種寫法類似於定義一個變量,在定義fun2之前,fun2是不存在的.

雖然這種寫法解決瞭 不符合"先定義後調用" 的問題,但這樣的寫法不夠直觀.

摘自 簡生的代碼備忘錄
 

發佈留言