原始代碼
var aaa = (function() {
var bbb = function() { /* ... */ };
})();
// 預期 bbb 執行,實際未執行
原因
var bbb = function() {} **僅定義** 函數物件並賦值給區域變數 bbb。
- 函數定義**不會自動執行**,必須顯式呼叫
bbb()。
- IIFE 結束後,
bbb 成為閉包內的私有變數,外部無法訪問。
修正:在 IIFE 內主動調用
var aaa = (function() {
var bbb = function() { alert('bbb executed'); };
bbb(); // ← 顯式調用
})();
// 頁面載入即彈出 "bbb executed"
進階:將內部函數暴露給外部 (模組模式)
var Module = (function() {
var privateVar = 0;
function privateFn() { console.log('private'); }
return {
publicFn: function() {
privateFn();
return ++privateVar;
}
};
})();
Module.publicFn(); // 可調用內部私有函數
常見誤區對照
| 代碼 | 行為 |
var fn = function() {} | 定義函數,**不執行** |
var fn = function() {}() | 語法錯誤 (需包裝 (function(){})()) |
(function() {})() | 定義並**立即執行** (IIFE) |
var fn = (function() { return function(){} })() | IIFE 返回函數,**未執行**返回的函數 |
var fn = (function() { return function(){} })()() | IIFE 返回函數並**立即執行**該返回函數 |