2013-10-17 40 views
3

我正試圖在自執行匿名函數中包裝JavaScript對象字面值。下面的第一個代碼示例工作正常,但第二個代碼示例沒有,我不確定爲什麼?如何在JavaScript中返回對象字面值

作品:

(function(){ 
    return MyApp = { 
     init: function() { 
      console.log('MyApp init'); 
     } 
    } 
})(); 

不起作用:

(function(){ 
    var MyApp = { 
     init: function() { 
      console.log('MyApp init'); 
     } 
    } 
    return MyApp; 
})(); 

據我瞭解的東西,在SEAF應執行並立即返回。這就是爲什麼第一個示例將MyApp作爲可以與之交互的對象返回。我以爲MyApp的分配向SEAF內一個變量,然後返回它會做同樣的事情,但在:

Uncaught ReferenceError: MyApp is not defined 

爲什麼?

+2

在你的第一個例子你結果賦給名爲「MyApp的」全局變量。在第二種情況下,您將變量分配給名爲'MyApp'的閉包局部變量。您必須在某處指定閉包執行的結果,否則它會丟失。 –

+1

[你的代碼工作正常](http://jsfiddle.net/m5QeQ/)假設你捕獲返回值。 – zzzzBov

+0

正如zzzzBov指出的那樣,如果你把'var someName =(theClosureExecution)' –

回答

3

由於您的SEAF(更好地命名爲IEFE)的結果不在任何地方使用,函數返回的內容並不重要。現在比較

(function(){ 
    MyApp = {…} 
})(); 

(function(){ 
    var MyApp = {…} 
})(); 

不同的是,在第二個功能您的變量是由var keyword這使得當地的IEFE之前,而在第一個功能是一種隱性的全球(你應該避免)。這樣,第二個片段不會分配給全局範圍內的任何內容,稍後將從外部訪問MyApp將會失敗並返回錯誤。

更好的回報一定的價值,你然後將分配給全局聲明變量:

var MyApp = (function(){ 
    return {…}; 
})(); 
+0

如果我用它來命名空間我的JavaScript代碼,返回一個對象文字是實現一個Singleton模式的最好方法,真的想要在任何特定時間使用該應用程序的一個實例嗎? – Iain

+0

是的,可能。如果模塊中沒有任何本地變量,則可以省略IEFE;它不一定需要是對象字面值,但可以使用任何方式創建對象。 – Bergi

1

你的第一個例子做的是設置MyApp的作爲全球變量 - 不是由var關鍵字或點號之前,因爲變量MyApp,它成爲全球性的。如果你將MyApp放入一個自動執行的函數中,這聽起來對你來說並不是一個問題 - 你可以真的從中刪除return聲明 - 甚至可以在同一函數中定義其他全局變量。你永遠不會參考你的頂級功能的結果,所以沒有使用return

第二個示例將MyApp設置爲使用var的局部變量,因此它只在運行它的函數的上下文中可見。