2012-02-26 20 views
3

我一直在積極使用揭示模塊模式多年,但還有一些我想深入瞭解的東西。根據我的理解,自我執行功能的潛在好處是自我執行,這兩種方式在這種特定模式下似乎都不需要/不被利用。另外一個我不明白的地方是,在下面的場景中,在SocialMedia函數()中包含函數Init,即嵌入函數,自執行函數似乎是JS中一個非常獨特的構造,isn奇怪的是,我們可以將一個屬性值賦給一個自動執行的代碼塊嗎?爲什麼我們在顯示模塊模式中使用自執行功能?

var myObj = { 
    prop1, "prop1value", 
    SocialMedia: (function() { 
     function Init() { 

     } 
     return { 
      Init: Init 
     } 
    })() 
} 
+0

_「是不是奇怪的是,我們可以只分配一個屬性值,自動執行的代碼塊」 _ - 我不認爲這是奇怪的:你可以爲_any_表達式分配一個屬性,爲什麼不給函數調用的結果? (即使是不返回值的函數調用也會工作,因爲它有效返回undefined。) – nnnnnn 2012-02-26 23:28:27

回答

8

爲什麼我們使用自動執行功能,在暴露模塊模式?

JavaScript具有一流的功能,並且沒有塊範圍界定,因此函數用於引入新的範圍。

在下面的場景是什麼使得它能夠包裹社會化媒體()的函數,即嵌入式功能 內部函數初始化......是不是很奇怪的是,我們可以只分配一個屬性的值到自執行代碼塊?

在JavaScript中,函數只是一個響應()new運算符的對象。

與其他對象一樣,您可以在定義它時使用它,或將它存儲在變量或屬性中供以後使用。

自動執行功能似乎是一個非常在JS

獨特的結構這不是JavaScript特有。有first class functions所有語言都有這個屬性,例如:

  • Lisp語言,
  • OCaml中,
  • 斯卡拉,
  • 圍棋,
  • C#(通過委託),
  • C(通過
  • Python,
  • Perl(通過&),
  • 紅寶石,
  • 的Lua

在最近的語言發展,一流的功能是常態,而不是規則。非靜態類型的語言使它更容易,因爲類型系統語法沒有開銷,也沒有variance問題。

即使Java可能會跳上Lambdas slated for Java 8的潮流。

在許多其他語言中,立即調用函數並沒有那麼有用。大多數其他語言都是block-scoped,所以如果你想保持你的變量分開,你只需使用{...}塊。在JavaScript中,var的範圍最小,包含function或Program,因此function是引入新範圍的最簡單方法。

Ruby在塊和函數之間的區別很小,所以在這方面可以認爲與JS類似。

+0

Thankyou !!!多麼好的回答:) – Baconbeastnz 2012-02-27 01:22:52

1

自執行功能用於引入新的示波器,另請參閱Mike Samuels的答案。

有兩個原因:

  • 避免污染在全球範圍內
  • 使用閉包,即從一個額外的範圍「導出」功能

當然可以疊加範圍,但通常你不會創建那些大的模塊,你必須避免污染你的本地模塊範圍:-)

此外,你的自我執行功能例如是無用的,因爲它完全等同於

var myObj = { 
    prop1: "prop1value", 
    SocialMedia: { 
     Init: function Init() { 

     } 
    } 
} 
+0

是的我通常會在裏面放置更多的方法,所以Init,CreateButtons()等等,然後我引用myObj.SocialMedia.Init(), – Baconbeastnz 2012-02-27 01:26:15

相關問題