2015-12-17 10 views
16

私は今、私はそれはをスローfunction(){}は機能しませんが(function(){})はなぜですか? (クロームデベロッパーツール/ノード)が

function(){} 

または

function(a){ 
    console.log(a) 
} 

を定義することができなかったことを、この奇妙な振る舞いを見てきました。

しかし、test = function(){}または(function(){})が機能しました。

Safariのdevのツールは、より良いエラーレポートを持っている:それはあなたがそれを使用することはありません場合

SyntaxError: Function statements must have a name.

さて、それはそのような関数を定義しても意味がありませんと言います。しかしそれはまだ変だ。私はすでに質問に答えを出していると思います。

+0

FFでも関数名に明確なカットエラーメッセージが必要です - SyntaxError:functionステートメントは 'function(){}()'を実行できないため、おそらく名前が – hazardous

+0

でなければなりません – Hacketo

+0

最初は未定義の関数構文ですが、2番目はオブジェクトです – SaidbakR

答えて

28

JavaScriptが関数宣言の関数式です。前者は直ちに呼び出すことはできませんが、後者はすぐに呼び出すことはできません。それは言語文法の問題です。

関数宣言:(=の右側)

function foo() { 
    // ... 
} 

関数式:機能の周りに括弧を追加することにより

var foo = function() { 
    // ... 
}; 

、あなたはする機能を強制しています関数式として解析されているのは、括弧内に関数宣言を置くことができないためです(式のみが想定され、受け入れられる)。

(function foo() { 
    // ... 
}); 

あなたは、すぐにそれを呼び出すことができます。より詳細な書き込みアップのために

(function foo() { 
    // ... 
})(); 

Function Definitions in JavaScriptをチェックしてください。

+2

正規表現は*関数宣言*になっています。 「関数ステートメント」は特別なES6以前の何かを意味していました。 – Bergi

+0

@Bergiもちろん、ありがとう。訂正されました! –

9

角括弧(function(){})は、関数が評価することを意味し、オブジェクトは現在角括弧の中に含まれており、この評価は関数を返します。これは、(function(){})();のように呼び出すことができます。

function(){}は評価されません。あなたが言ったように、あなたは何らかの方法でそれを使用することができないので、これがエラーを引き起こすのは理にかなっています。

関連する問題