2015-08-26 34 views
-3

我有一個庫(Hubspot Odometer),我正在使用我正在開發的Web應用程序中,它可以很好地在頁面上創建和運行里程錶樣式小部件。手動調用IIFE

問題在於它們是儀表板界面的一部分,它具有通過AJAX加載的窗格。初始視圖不通過AJAX加載,因此JavaScript執行得很好,里程計正確顯示。

當我加載一個帶里程錶的新窗格時,它們不能正確渲染,也不會像他們應該那樣操作。原因是里程錶圖書館作爲一個大型的IIFE運行。

我想知道的是,我可以通過AJAX加載內容後手動重新調用IIFE,這樣里程錶就可以正確渲染和綁定了嗎?

我也使用jQuery,如果它提供給我任何其他選項。

回答

2

IIFE的全部想法是它的立即執行的匿名函數。所以根據定義,沒有辦法重新執行它。

不過,你可以將函數表達式存儲到一個全局變量中,然後執行它。例如

window.my_iife = (function() { /* stuff */ }); 
window.my_iife(); 

注意在語法上略有差異相比傳統IIFE:((function() {})());

通過存儲在window的功能,你可以從任何開發者控制檯或其他地方日後訪問您的碼。如果您只是簡單地將它存儲在var中,或者將它聲明爲function my_iife() { /* ... */ },則可能會導致var或函數聲明本身被包裝在IIFE中,從而無法訪問。舉個例子,如果你聲明你的var/function的文件是Sprockets清單的一部分(例如Rails中的application.js),就可能出現這種情況。

+2

第1行圓括號的含義是什麼?你的方法比'function my_iffe(){} my_iffe();'有什麼優勢? – zeroflagL

+0

主要是個人風格的問題。在使用我的方法時,您可以保證能夠從開發者控制檯重新調用該函數,而不是在其他關閉中可能會丟失。 OP確實提到他想「手動」調用它。 –

+1

封閉括號完全沒有,它只是分配一個函數表達式創建的函數。 – RobG

2

試試這個:

var funcName = (function funcName() { 
    // rest of the code 
    return funcName; 
}()); 

也看到這個jsbin