2017-08-24 71 views
-2

我知道什麼是立即調用的函數表達式。我知道這個圍繞函數放置括號是什麼意思? (function(){})

let x = (function() 
{ 

}) 

let x = function() 
{ 

} 

let x = (function() 
{ 

})() 

,但區別在哪做的括號在這裏有單獨什麼意義?我以前在幾個地方見過它。

I thought this was an example but it might not be one X)

編輯:這些並沒有真正意圖是代碼片段,總之,只要他們的片段,原來有,他們是函數的聲明和函數表達式的情況差別大。我沒有想到這一點。對於上下文更改感到抱歉,並感謝所有的關心!

+1

你發佈的鏈接中提到了'(function(){})'? – Xufox

+0

這一個:'讓富=()=>({ 欄:{ FOO:1, 欄:2, } });'@Xufox –

+0

必須有更多的這個比你所示。如圖所示,第一個例子是語法錯誤,最後一個例子完全沒有意義。 –

回答

5

答案給編輯的問題:

but what about this

let x = (function() 
{ 

}) 

沒有目的的那些()在所有服務。這是完全一樣的:

let x = function() 
{ 

} 

答覆嵌入評論

a comment你說你其實是想知道這一點:

let foo =() => ({ bar: { foo: 1, bar: 2, } }); 

()是必要的,因爲這是一個帶有簡潔主體的的箭頭功能返回對象初始值設定項的結果。但是,如果在=>之後立即有{,則{將是塊(冗長)正文的開頭(而不是對象初始值設定項的開頭)。這就是爲什麼()在簡明箭頭的表達式主體周圍是必需的,以便消除{的歧義。

請注意,()而不是各地的功能;只是它的身體。

你可以寫你所做的一切:

let foo =() => ({ bar: { foo: 1, bar: 2, } }); 

{}return

let foo =() => { return { bar: { foo: 1, bar: 2, } } }; 

但不是:

let foo =() => { bar: { foo: 1, bar: 2, } }; // Wrong 

因爲{會被解讀爲塊體的開始。


答到original question

我將承擔這些有名字,否則你的第一個例子是一個語法錯誤。

but what about this

(function() 
{ 

}) 

這將是一個函數表達式不是 immediateley調用。與第一個示例不同,它是在逐步執行達到它時進行評估的,而不是在最初創建它所處的上下文時進行評估。

除非有什麼東西在使用該表達式的結果,否則它是一個無操作(無所事事),因爲表達式中沒有任何東西運行它。

如果表達式的結果是正在使用(它是一個賦值語句的右邊,它被傳遞給函數作爲參數等),它周圍的()是不必要與function表達。 (這並不總是帶有箭頭的功能的情況下)。

1

(function() {})function() {}之間沒有區別。

此行也是相同的:

var test1 = (function() {}); 
var test2 = function() {}; 

但是,如果你只寫:

function() {}; 

你會得到一個語法錯誤。如果你不希望一個語法錯誤,你必須這樣寫:

(function() {}); 

,但此行是無用的,什麼都不做。因爲定義的功能從來沒有被調用,也沒有人可以訪問它。

+0

那麼,如果**是**,那麼它就是預計發表聲明的地方。 –

+0

哦,是的,我明白你的意思 – Magus

3

鑑於the original question

所有其他條件相同的(很可能是不是因爲你忽略上下文):

  1. 這是一個語法錯誤。它從一個函數聲明開始,然後不符合語法要求。
  2. 這是一個立即調用的函數表達式。
  3. 括號使這成爲一個函數表達式(就像例2)。它沒有被調用(最後缺少())。它沒有分配到任何地方。它什麼也沒做。

但是現在你已經重寫的問題,並徹底改變了意義。

實例3和實例1現在是相同的。

()圍繞一個表達式除了覆蓋運算符優先級之外什麼都不做,而且裏面沒有任何運算符。

+0

以及它不是一個語法錯誤 –

+1

嗯,它是。去嘗試一下。 –

+0

@MinaMichael:如圖所示,第一個是。我想,你已經刪除了太多的背景。 –

-1

用這種方法在括號中括起一個函數可以將它打包,以便在另一個變量或函數中使用。

例如,你可以使用這個(有點冗餘)來設置一個變量爲一個函數。

var foo = (function bar() { /* code */ }); 
foo(); // calls code in bar() 

這也是一種打包回調函數的方法,例如,

asyncFunction((function callback() { /* code */ }); 

你不會想因爲它變成隱藏在你的代碼的其餘部分在下面的示例中使用這種類型的聲明的自身。

function foo() { /* code */ }; 
(function bar() { /* code */ }); 

foo(); // runs foo code 
bar(); // ERROR - bar() undefined in this scope 

類似的語法與「立即調用的函數表達式」中的尾括號一起使用。這將一個變量傳遞給你的函數並以內聯方式運行它。

(function foo(a) { console.log(a) })("Hello World!"); 
// Prints "Hello World" 

TL; DR - 使用它作爲一種方法來寫一個叫內聯函數,並將其包裝成另一個函數或變量,或尾隨括號,按指定的輸入立即打電話給你的函數。

相關問題