2011-07-30 68 views
6

這裏晚了,所以我可能不會很好運作,但我發現這段代碼,我似乎無法弄清楚爲什麼它是這樣使用的(注意:我明白它的作用,我不明白的是它背後的意義)。這段代碼有意義嗎?

(function() { 

    var narcissus = { 
     options: { 
      version: 185, 
     }, 
     hostGlobal: this 
    }; 
    Narcissus = narcissus; 
})(); 

自執行的匿名函數來避免全局命名空間的污染,但是這個代碼並不需要引入比Narcissus其它變量,它可以有很容易被改寫爲Narcissus = {...};。我能想到的一些可能的原因是代碼或實施缺陷的未來發展。有沒有我看不到的東西?

+1

同意你的意見。除了說它有不同的風格,或者原來的人不知道你提出的其他方式。 – Mrchief

+1

唯一有效的原因可能是全局範圍內的'this'在非瀏覽器環境中無效。自我執行功能中的'this'總是全局主機 – Raynos

+1

爲什麼在數字之後和結束括號之前有逗號? –

回答

1

從維護的角度來看它允許創作者在沒有得到創造narcissusNarcissus分配之間泄露封閉範圍後添加代碼。雖然在這種情況下沒有任何代碼,所以除了上面提到的this之外,我沒有看到任何收益。

0

的部分你缺少的是JavaScript是一種區分大小寫的語言,所以

Narcissus != narcissus; 

他被省略var關鍵字添加Narcissus在全球範圍內,或水仙是在全球範圍內已經上市,或者Narcissus已經在調用這個函數的地方定義了。

然後將其定義爲匿名函數中的對象narcissus

我不能告訴你他爲什麼要這樣做,但似乎他可能已經在this引用對象的範圍內,並且他想將關鍵字hostGlobal設置爲全局對象而不是當前作用域對象。

這就是他將它作爲匿名函數運行的原因,因爲它們在全局作用域而非函數作用域中執行。所以在他的代碼hostGlobal: this指的是全局對象。

當然,他可以只使用hostGlobal: window,除非該代碼也被在非瀏覽器環境中運行,如Node.js的地方全局對象是globalwindow。所以他可能會這樣做是一種非常不直觀的實現方式。

hostGlobal: (global === undefined)? window : global 

希望這有助於

+0

'他正在通過省略var關鍵字將全水仙添加到全球範圍,或者水仙已經在全球範圍內可用,或者水仙已經在這個範圍內定義了這個範圍功能正在調用中。「我知道所有這些東西,感謝您將其清除。第二部分非常有趣,我會研究它 –

+0

@Gabi如果你想讓我的答案的任何部分更清楚一點請問。 – AshHeskes