2013-04-01 38 views
3

當我做了一個匿名函數在JavaScript這樣的:配售匿名函數的參數在JavaScript

(function(){ 
/* some code here */ 
})() 

在哪個對象將是這一功能加入,並在將這個功能生活?

您也可以在jQuery的源代碼中看到這樣一個匿名函數:

(function(window, undefined){ 
    /* some code here */ 
    })(window) 

如何此函數的參數來自匿名,0-ARG功能區分開來?

+4

爲什麼這個downvoted? – Pointy

回答

4

JavaScript中的函數是的值。也就是說,一個函數是由一個對象來表示的,就像任何其他對象一樣,它可以是一個變量的值或參與表達式。

因此

(function() { ... }) 

是一個值,就像17"hello world"是一個值。

當一個函數(作爲一個值)出現在一個表達式中,然後是(...),括號之間用逗號分隔的表達式列表,這是一個函數調用。

行,所以:

(function() { ... })() 

創建函數(的值),然後調用無參數該功能。該函數對象,至少作爲該代碼的直接結果,不存儲在任何地方。它在函數調用完成後基本消失,並且該子表達式的整體值將是返回的函數。

將參數傳遞給該函數不大於參數傳遞到任何其他功能不同。在您引用的具體示例中,目的是防止由錯誤的「外來」代碼導致的某些異常情況。你真的例子應該閱讀:

(function(window, undefined) { 
    // code 
})(this); 

符號this是保留字,它的值是運行時的完全控制之下。 (當然,它在一個本地執行上下文正是如此控制值。)當在全局範圍內進行評價,上述代碼確保內部匿名函數,符號「窗口」將是全局上下文的參考。那種結構的也是可以在上下文中使用除瀏覽器,如Node.js的,例如,在全球範圍內的不叫「窗口」的代碼是有用的。

+0

這個答案很好,我現在明白你的解釋是如此的好,非常感謝你! – Bright

+0

@ user2162852感謝您的讚美!我很高興你現在明白了。玩得開心用JavaScript! – Pointy

1

你給兩個示例是匿名的功能,根據Wikipedia definition的第一行:

匿名函數[...]是定義的函數(或子程序),以及可能調用,而不被綁定到標識符

參數對匿名沒有影響。匿名函數可以使用0,1,2,... n個參數,就像非匿名函數(即命名函數)一樣。

匿名函數的一個主要優點是它們不必生活在任何地方 - 它們可以像其他類型的其他值一樣被內聯定義和使用。

0

添加到@尖尖的答案添加參數匿名函數沒有任何區別

(function(){ 
    /* some code here */ 
})() 

(function(window,undefined){ 
    /* some code here */ 
})(window) 

這兩個功能都失去了他們被稱爲後,唯一不同的是,第二個函數裏面的一些變量或函數被存儲在窗口上下文中,但匿名函數本身在調用後會丟失。

如果你需要保持參考函數嘗試

(window.myFunc = function(arg1, arg2, arg3) { 
    /* your code here*/ 
})(arg1, arg2, arg3)