2013-06-22 77 views
2
(function(global, $data, undefined) { 
    $data.Entity.extend('TodoDBModel.TodoItem', { 
    'Id': { key:true,type:'Edm.Guid',nullable:false,required:true }, 
    'InSync': { type:'Edm.Boolean',nullable:false,required:true } 
    }); 
})(window, $data); 

這是一個簡單的函數還是任何類型的類?這個JavaScript結構如何被調用?

我們如何定義這些參數global, $data, undefined以及以功能右括號和(window, $data)參數結尾的最後一行代碼?

+0

這是一個有趣的問題,但是 - 我覺得更翔實的名字將真正幫助它「這是什麼結構,稱爲」難求在谷歌或堆棧溢出搜索讓它更適用於大衆,我建議你改變名稱 - 由你決定。 (也許是「什麼是函數(立即稱爲自己調用」?或者甚至是更具代碼性的東西,我不確定) –

+0

公平點@ benjamin-gruenbaum,標題的模糊性使我想要編輯它 - 但怎麼做你從閱讀中知道該函數立即自動調用? – icedwater

回答

6

它被稱爲IIFE - 立即調用函數表達式。

援引維基百科:

一種立即調用的函數表達式(或IIFE,發音爲「還不確定」)是能產生使用JavaScript的函數作用域詞法作用域一個JavaScript設計模式。可以使用立即調用的函數表達式來避免塊內的變量提升,防止污染全局環境,同時允許公共訪問方法,同時保留函數中定義的變量的隱私。這種模式被稱爲自我執行的匿名函數,但Ben Alman將該術語IIFE引入模式的語義更準確的術語中。

這裏發生了什麼是你正在定義一個函數(通過函數表達式)並立即調用它。這提供了封裝。

例如,如果有人要覆蓋語言原語值undefined *的值,它會將其作爲第三個參數。它還提供兩個參數(數據,這是在代碼和window(在瀏覽器中的全局對象)作爲global變量。

*嚴重的是,有沒有人真正覆蓋未定義的?還有,這是不可能的現代瀏覽器

這裏是一個更基本的例子:

(function(i){ // declare a function that accepts a single parameter - i 
    alert(i);//alert the value of i 
    // Next, we'll invoke the function we just declared with the value 5, 
    // which means i will be 5 in the function 
})(5); 
+0

感謝你的解釋我真的停留在它現在我已清除 – Blu