2014-10-19 106 views
5

我已經使用在JavaScriptAngularJS IIFE和已使用的結構如下:爲什麼將一個IIFE分配給一個變量?

方法1:

//IIFE Immediately Invoked Function Expression 
(function() { 


}()); 

然而,我已經看到了經常以下其中一個變量是分配給IIFE

方法2:

//IIFE Immediately Invoked Function Expression assigned to doStuff variable 
var doStuff = (function() { 


}()); 

NOTE:這個問題是不是關於這種模式是什麼或什麼是一個IIFE是。這與爲什麼要在IIFE上使用返回變量及其與Angular實踐的關係有關。

在角度方法1工作正常,但在我看到的許多原始JS例子中,使用了方法2。我的假設是,任何在doStuff中設置的東西都可以通過它調用並調用。但是,我不能100%確定這兩種方法之間的確切推理或區別,並且需要一些幫助來理解何時使用不同的方法?

+0

@Bergi - 這ISN」重複 - 請仔細閱讀問題,並查看與該鏈接的區別。該鏈接不回答這個問題。 – atconway 2014-10-19 15:53:23

+1

我不確定我是否理解這個問題。你似乎知道IIFE是做什麼的;現在爲什麼要使用IIFE的退貨?無論何時你想從表達式中返回一個返回值給doStuff賦值,而不是隻執行一個void IIFE。如果你正在尋找用例,你應該谷歌爲「模塊模式」,因爲這是一個帶有返回值的IIFE被調用。 – Bergi 2014-10-19 15:59:13

+0

@Bergi - 我相信你剛剛發表的評論實際上是對我發佈的內容以及我所稱的'答案'的一個很好的解釋。如果你重新打開併發布該Blurb作爲答案,我會upvote。不要忘記,僅僅因爲某些東西對你來說顯而易見並不意味着它是OP(我)。另外,因爲它顯然不是結案的理由。我需要具體的例子和解釋爲什麼返回變量與不使用。在Angular中,他們一直沒有返回變量,但很多JS例子都使用返回值。我想知道並理解'爲什麼'。 – atconway 2014-10-19 16:06:22

回答

7

方法#2的原因是您可以在IIFE中找到代碼返回某些內容(通常但不一定是對象或函數)。 IIFE返回的是最終被分配的內容。例如: -

//IIFE Immediately Invoked Function Expression assigned to doStuff variable 
var doStuff = (function() { 
    var privateInformationForDoStuff = 0; 

    function doStuff() { 
     console.log(++privateInformationForDoStuff); 
    } 

    return doStuff; 
}()); 

在那裏,可變最終成爲一個功能,每次它叫的時候,給了我們一個數比前次更高的參考。 IIFE在那裏確保沒有任何東西可以修改privateInformationForDoStuff變量,它對doStuff函數完全是私有的。

這樣做的常見用途是創建與他們不同的功能,有時也被稱爲模塊,這也可能是唯一的「模塊」內共享私人信息的對象:

var MyApp = (function() { 
    var privateModuleInformation; 
    var morePrivateModuleInformation; 
    // ... 

    function doThis() { 
     // ... 
    } 

    function doThat() { 
     // ... 
    } 

    function doTheOther() { 
     // ... 
    } 

    return { 
     doThis: doThis, 
     doThat: doThat, 
     doTheOther: doTheOther 
    }; 
})(); 
+1

這有助於很多謝謝你。我認爲這種差距是爲什麼'AngularJS'不需要爲爲控制器,服務等創建的'IIFE'分配一個變量。我相信它不需要它們的原因是因爲在'IIFE'中代碼註冊自己通過'ng-app'指令使用Angular模塊容器,從而在不使用返回變量的情況下訪問從'IIFE'返回的所有內容。你知道這是一個真正的解釋嗎? – atconway 2014-10-19 15:06:22

+0

@atconway:可能。您看到IIFE不會在非Angular代碼中返回值。舉例來說,這裏是我通常用於瀏覽器的polyfill,它本來就沒有'String#trim'(尚):http://pastie.org/9660901(當然它通常是更大的一部分)。 – 2014-10-19 15:08:42

+0

通過你在這篇文章中的例子,我假設變量'doStuff'和'myApp'將用於_same_ .js文件引用,而不是其他文件?或者,這些返回變量是否可以在多個.js文件中公開使用? – atconway 2014-10-19 15:16:40

相關問題