2011-02-24 161 views
3
var myval = (function(){})(); 

我不明白(function..)的含義,甚至其他代碼。這個javascript代碼是什麼意思?

+0

(不是函數本身這個時候),它是一個匿名函數的語法在JavaScript中的[什麼是括號中的作用 – CarneyCode 2011-02-24 07:31:14

+0

可能重複在下面的一段代碼?](http://stackoverflow.com/questions/2938060/whats-the-role-of-the-parentheses-in-the-following-piece-of-code) – 2011-02-24 07:42:19

回答

8

你有什麼存在:

自調用匿名函數

你首先由具有以函數本身paranthesis創建函數表達式。 只是寫

function() { 
}() 

不會在這種情況下工作,因爲這將定義一個函數聲明。

所以以後我們有,我們可以通話本身通過附加()

(function() { 
})(); 

要驗證,試試這個:

var myval = (function(){return 'self executed!'})(); 

alert(myval); // === 'self executed' 
8
  • function(){} - 函數式,它定義一個功能
  • (function(){}) - 包裝它就像這樣做確保它被視爲一種表達
  • (function(){})() - 添加()調用功能

然後返回值賦值給變量。

這通常用於允許使用變量而不污染全局範圍。

+1

'function() {}'只會是賦值中的表達式。 – jAndy 2011-02-24 07:37:22

+1

@jAndy,不僅在一個賦值中,還有* expression *的其他上下文,例如:'0,function(){}','new function(){}','foo(function(){}) '等等...對語法的限制是在* ExpressionStatement *的層次上的,它不能以'{'或標記'function'開始。在*語句上下文*'function(){}'將只是一個'SyntaxError'(語法不產生匹配)。 – CMS 2011-02-24 08:21:12

+0

@CMS:是的,我只是想說只是'function(){}'不一定是一個表達式。 '+ function(){}()'或'!function(){}()'也可以:-) – jAndy 2011-02-24 08:34:17

1

function(){}定義匿名函數 (封閉) 沒有正文。通過將它包裝在大括號中並在末尾添加空的參數列表(()),您正在運行此閉包。這實際上相當於:

var f = function() {}; 
f(); 

這會更容易把握嗎?

(function(x, y, z){})(1, 2, 3) 
+0

這裏沒有關閉 – aaronasterling 2011-02-24 07:40:47

+0

已更正,thx。只是爲了澄清 - 如果函數會使用一些在外部定義的局部變量,那麼稱它爲閉包就足夠了嗎? – 2011-02-24 08:03:30

+0

它越來越近了。在該範圍執行_outside_時,它必須從封閉範圍引用局部變量。實際上,這意味着它必須從一個函數中返回,然後除了從一個封閉的範圍引用一個本地以外,它被視爲封閉。 – aaronasterling 2011-02-24 08:12:43

2

這將創建一個匿名函數並立即調用它。例如

(function ($) { 
    // Original JavaScript code. 
})(jQuery); 

將允許你在那裏使用$,它等於jQuery

+0

+1常見示例 - 我總是以';(function ...'開頭)(因爲我寫了分號自由碼,這是ASI可能無法按預期工作的一種情況) – 2011-02-24 09:19:21

0

我們來分析一下它一塊一塊:

這定義了一個匿名函數(即功能沒有名稱)

function(){} 

當然,在{}括號之間插入一些指令會更有用。現在

,如果你沒有

myval = function(){<something>}; 

您分配功能MYVAL(函數,而不是它的返回值!)

,那麼你可以調用myval(),這將是一樣調用功能本身。

在這裏,您可以通過在末尾放置()來調用函數。因此:

var myval = (function(){})(); 

調用函數,並把結果myval