2017-08-24 4 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

この1: 'FOO =()=>({ バー:{ 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, } }; // Wrong 

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

または{}returnと::

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

なく

あなたはそれをあなたが行った方法を書くことができますブロックボディの始まり。 original question


回答:

私は、そうでない場合は、あなたの最初の例では、構文エラーであるとして、これらの名前を持っていると仮定するつもりです。 が呼び出さ immediateleyがないことを関数式になり

but what about this

(function() 
{ 

}) 

。あなたの最初の例とは異なり、段階的実行が最初に作成されたコンテキストではなく、段階的実行に達した時点で評価されます。

何かがその式の結果を使用していない限り、式の何もそれを実行しないので、何もしません。

発現の結果はは(それが割当の右側だ、それは引数、等の関数に渡されます)が使用されている場合、その周り()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 - 指定された入力と、すぐにあなたの関数を呼び出すために、末尾の括弧で、名前の関数をインラインで記述し、他の関数や変数にそれをパッケージ化かする方法としてそれを使用してください。

関連する問題