1

重複の可能性:
関数式とJavascriptの宣言の違いは何ですか?

これらの方法で関数を宣言することには大きな違いがありますか?

  1. function foo(){
         alert('BAR');
    }
    
  2. var foo = function (){
         alert('BAR');
    }
    
  3. var foo = function bar(){
         alert('BAR');
    }
    

私はここで次のように言われました:

これは別の時間に発生し、無名関数を参照する変数になります。関数宣言は、スコープ内で段階的なコードが実行される前に行われ、バインディングと適切な名前の関数の両方が生成されます。

関数を宣言する方法は、コードの効率に本当に影響しますか?もしそうなら、どちらの方法を使用するのが最適ですか?

4

1 に答える 1

7

はい、大きな違いがあります。

1つ目は関数宣言です。これは、実行コンテキストに入ると、ステップバイステップのコードが処理される前に発生します。いかなる種類の制御ブロック内にも含めることはできません(たとえば、ステートメントの本文では合法ではありません。ただし、そうすると、ほとんどのブラウザーは、仕様とは異なり、非常に驚​​くべき動作ifを引き起こす場合があります)、それに対応しようとします 。その結果、名前付き関数になります。

2つ目は、関数式(具体的には無名関数式)です。すべての式と同様に、コードの段階的な実行で検出されたときに処理されます。そして、すべての式のように、それは制御ブロック内にあることができます。その結果、名前を持つ変数に名前が割り当てられていない関数になります。

3つ目は、名前付き関数式です。上記のような関数式ですが、関数にも名前が付けられています。IE8以前では、IEは実際にはかなり間違っており、2つの別々の関数を(2つの異なる時間に)作成するため、これらを回避する必要があります。(基本的に、IEはそれを関数宣言関数式の両方として扱います。)IE9はついにこれを正しくします。

2番目と3番目の例は、自動セミコロン挿入に依存していることに注意してください。これらは両方とも割り当てステートメントであるため、 (関数;の終了後)で終了する必要があります。}

于 2012-06-14T15:17:08.780 に答える