4

JS コンソールで遊んでいると、奇妙な構文に直面しました。誰かがそれについてもっと教えてくれるのだろうか..

これを試して:

>( function f(){console.log('i am f')} , (function x(){console.log('i am x')})() , y=2 , console.log('hello') )
i am x
hello
undefined
>f()
ReferenceError: f is not defined
>this.y
2

これは失敗します:

( var c=2 ) SyntaxError: 予期しないトークン var

そのため、括弧内のコンマ区切りの式が評価され、代入はたまたまグローバル スコープに反しますが、名前付き関数宣言の参照はクロージャーのように内部に閉じ込められたままになります

function C(){
    ( function f(){console.log('i am f')} , (function x(){console.log('i am x')})() , y=2 , console.log('hello') )
}

次にインスタンス化します。

>var c=new C()
i am x
hello
undefined
>c.y
undefined
>this.y
2

グローバルスコープで実行されたのとまったく同じように起こります!

この構造の使用法/目的は何ですか?

もう1つ:

>( function f(){console.log('i am f')} , f() )
ReferenceError: f is not defined

したがって、名前付き関数は括弧内でも参照できません。

4

2 に答える 2

6

名前付き関数は、関数宣言( functionas a statementを使用) ではなく、実際には関数式( functionas an operatorを使用)であるため、「内部にトラップ」されません。これは、それらの名前が現在の名前空間で自分自身への参照にならないことを意味します。


特定のキーワード/トークンは、 などのステートメントとしてのみ使用できますvar。したがって、インタープリターが式であると想定する条件でそれらを使用しようとすると、エラーがスローされます。


についてはy === 2、これは、 を設定していないためであり、グローバル スコープでvar y;設定します。Cy = 2window.ythis === window


この構造の使用法/目的は何ですか?

  • コンマ演算子,を使用すると、1 行で複数の式を実行できます。
  • 関数式は、すぐに呼び出してクロージャーを作成したり、変数内に格納したりするなど、非常に多くのことに役立ちます。
于 2013-08-18T21:54:57.543 に答える