var f = function(){
console.log('立即執行 f()');
f.p = 'fp';
function f(){
console.log('執行 f()');
}
return f;
}(); //立即執行 f()
f(); //執行 f()
f.p; // fp
(圖1)變數 f 是一個立即執行函式,內部又巢狀了一個同名函式 f()。雖然 f.p 的賦值語句位於內嵌函式 f() 定義之前,但是在執行的時候賦值語句滯後於函式的定義。
var g = function(){
console.log('立即執行 g()');
function f(){
console.log('執行 f()');
}
f.p = 'fp';
return f;
}(); //立即執行 g()
g(); //執行 f()
g.p; // fp
(圖2)將變數 f 改成了 g,並將 f.p 的賦值語句寫到內嵌函式的下方,這比圖1的寫法更容易理解。
圖3正常,圖4報錯。儘管圖4的變數 f 是一個立即執行函式,但是立即執行函式與函式並不是一回事。
修正方法1:程式碼改成圖3那樣,f 不再立即執行,f 是全域性函式。
修正方法2:程式碼改成圖1或圖2那樣(立即函式裡面新增內嵌函式)。
本作品採用《CC 協議》,轉載必須註明作者和本文連結