2015-10-09 42 views
2

我有一個文件bg.js其內容只是一個IIFE。我想從另一個文件中的另一個函數加載這個文件/調用函數。由於IIFE是匿名的(這是對的?)我不能通過名稱來稱呼它。看來我必須加載整個文件,以便立即執行。從另一個Javascript文件調用IIFE

我已經完成了搜索,發現了許多關於IIFE是什麼的教程和文檔,但是我沒有見過如何從另一個範圍執行一個。

如何從另一個JavaScript文件調用/加載一個來自IIFE的JavaScript文件?

更多信息 IIFE已加載到我的頁面的頁腳中。當我單擊鏈接進行導航時,不會執行頁眉和頁腳腳本。頁腳中的IIFE負責設置背景圖像,所以我需要讓該函數在我的perPageBindings()

中執行我認爲我需要做的是從正在執行的主體中的另一個函數調用IIFE在perPageBindings()

編輯爲清楚起見 有我正在考慮兩個方案:

  1. 腳本標籤乾脆轉移到從頁腳身體;或
  2. 給這個IIFE命名,那麼它不再是匿名的,然後調用名爲函數從其他地方

如果2是一個可行的選擇,那麼我想我會創造約轉換和IIFE到一個新的問題命名函數。

+0

請讓我知道如果我要發佈一個代碼示例。 –

+2

您可以使用'$ .getScript'來全局加載js文件並執行它。 –

+7

根據定義,立即調用IIFE - 能夠「從另一個文件調用它」是沒有意義的。 – Jamiec

回答

2

好像你想要定義這個功能,使它可以重用。如果要從頁腳調用,請在IIFE中包裝可重用的函數調用。這種方式立即在頁腳中調用並調用你的函數,但你也可以在別處調用這個函數。

例子:

JS:

function setBackground() { 
    // sets background and can be called whenever 
} 

HTML:

<footer> 
    <script> 
     (function() { 
      setBackground(); 
     }()); 
    <script> 
</footer> 
2

如果您想要在腳本中訪問的東西,一個功能或屬性,它已被匿名調用後,您需要將該函數的一些內部函數暴露給可從全局範圍訪問的內容。

我不是說,你必須有你的函數把一個變量放到全球範圍內,儘管這是很多圖書館做,是UMD如下如果CommonJSAMD環境是不可用的路徑之一。

您應該看看Revealing Module Pattern以獲得更好的視角。

考慮下面的代碼片段:

(function(global){ 
    /* 
    * This variable will stay "private" 
    * because it is scoped to the IIF 
    */ 
    var someProp = "Hello World"; 

    /* 
    * This property is effectively exposed 
    * because it is accessible through 
    * myLib.foxtrot below 
    */ 
    var someOtherProp = "Hello to you too"; 

    var myLib = { 
     foo: "bar", 
     fiz: true, 
     buzz: 1, 
     foxtrot: someOtherProp 
    }; 

    /* 
    * myLib is now accessible through the 
    * global that we passed to the IIF below 
    * at the point of calling with "window" 
    */ 
    global.myLib = myLib; 

}(window)); 
相關問題