2015-12-04 30 views
0

看來,你是無法設置立即調用函數表達式給一個變量:保存到一個立即調用函數的引用

var foo = function() { 
    alert(); 
}(); // Immediately alerts 

foo(); // Returns "Uncaught TypeError: foo is not a function" 

foo真可謂是不確定的 - 但爲什麼呢?是否有任何方法可以實際保存對立即調用的函數的引用?

+0

沒有顯式的return語句,返回'undefined'。 – Sampson

回答

5

看來,您無法立即調用函數表達式設置爲一個變量

這是不正確

foo真可謂是不確定的 - 但爲什麼呢?

您所提供的代碼將IIFE的返回值foo

如果您有:

var foo = function() { 
    alert(); 
    return 5; 
}(); 

foo將有5值。

是否有任何方法可以實際保存對立即調用函數的引用?

是的,但它不是組織代碼的好方法:

var foo; 
(foo = function() { 
    alert('works just fine'); 
})(); 

爲什麼你需要立即調用的表達,當你還不如一個函數聲明:

function foo() { 
    alert(); 
} 

然後調用該功能:

foo(); 
+0

究竟是什麼 '(foo = function(){ alert('works just nice'); })();' 會幹什麼?它會執行'foo()'還是'function()'? –

0

你有giv在調用該函數的函數和值的函數之後,en()被分配給變量foo。所以當你試圖在接下來調用它時,它會說未捕獲的類型函數。只要刪除括號。

var foo = function() { 
    alert(); 
}; 
+2

但是,它不再是立即調用的函數表達式(IIFE)。 ;-) – RobG

4

除了由zzzzBov建議的方法,你也可以做你想使用一個命名函數表達式並返回從函數的引用什麼:

var foo = (function foo() { 
 
    alert(); 
 
    return foo; // Return a reference to this function 
 
}()); // Immediately alerts 
 

 
foo();

然而如上所述,這似乎不是一個好主意。只需聲明該功能即可。

另外,即使不需要,它也被認爲是包裝IIFE的好形式,所以從一開始就很明顯它是一個IIFE。否則,直到最後一行才能確定。

相關問題