3

なぜこれが構文エラーを返すのですか?

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

これにより関数の値が返されるため、それ自体が返され、何にも割り当てられないと思いますが、「SyntaxError:Unexpectedtoken(」)が表示されます。

しかし、これは機能します:

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

それらの折り括弧がどのような目的を果たしているのか説明してください。パーレンは「読みやすさを向上させる」ために使用されると言われていますが、この場合は間違いなくより多くの目的が果たされます。

()の使い方について詳しく教えてください。そのコード行を散文に翻訳するとしたら、()はどのようになりますか?私もこの概念を他の人に説明しようとしていますが、誰もが理解できるようにその意味を伝える必要があります。私が答えようとしている質問は、()の意味は何ですか?それらは意味的な価値を持っていますか、そしてそれは何ですか?

4

2 に答える 2

7

最初の例は関数宣言です。構文エラーである識別子がありません。関数宣言の文法は次のとおりです(識別子はオプションではないことに注意してください)。

FunctionDeclaration

function 識別子 ( FormalParameterListoptFunctionBody _{ }

括弧で囲むことにより、関数(匿名の式)に変換します。次の後に呼び出し括弧のペアを追加することで実行できます。

(function(foo){console.log(foo)})("hello"); //Will log 'hello'

関数式のガンマは次のとおりです(識別子はオプションになりました)。

FunctionExpression

function 識別子optFormalParameterListoptFunctionBody ( _ _{ }


括弧が関数宣言を関数式に変換する方法

この場合、括弧は「グ​​ループ化演算子」として解析されます。グループ化演算子の文法は次のとおりです。

PrimaryExpression

( 表現 )

グループ化演算子には式のみを含めることができるため、関数は宣言ではなく式として解析されます(明らかに、正確な例では、関数には識別子がないため、関数を宣言にすることはできません)。

于 2012-10-10T10:02:40.500 に答える
2

これは、がない()場合、function(){}行は関数宣言でありある()場合はであるためです。

関数宣言は奇妙な獣であり、コード実行前に定義されたスコープ内のどこでも利用できるようになっているため、次のようなスニペットが機能します。

foo();
function foo() { console.log('foo'); }
于 2012-10-10T10:02:16.083 に答える