25

興味深いことに、速度/機能の違いはありますか

function foo(bar) {
    alert("foo" + bar);
}

var foo = function(bar) {
    alert("foo" + bar);
};
4

1 に答える 1

27

速度に大きな違いはありません。(テスト

機能の違いがあります。

  • 関数宣言(最初のような)と関数式(2番目のような)は異なる時間に処理されます。
  • それらは、それらが発生する範囲に異なる影響を及ぼします。
  • 最初の関数には本当の名前があり、2番目の関数はES5以前にはなく、2番目の関数にはありません。ES6 / ES2015では、JavaScriptエンジンが変数の名前を関数に割り当てる必要があると仕様に記載されているため、これは行われます。

「関数宣言」と「関数式」を比較すると、このトピックについて多くの話があります(一部は正しいものもあります)。

しかし簡単に:

関数宣言

最初の例のような関数宣言は、ステップバイステップのコードが実行される前に、実行カーソルがその包含スコープ(包含関数またはグローバルスコープ)に入るときに発生します。したがって、処理時に段階的なコードが実行されていないため、非機能ブロック(、など)内に表示することはできませんiftry関数の名前は、それが表示されるスコープに追加され、関数オブジェクトには実際の名前が付けられます(その名前を照会する標準的な方法はありませんが、スタックトレースなどで引き続き役立ちます)。(注:一部のJavaScriptエンジンはブロック内で関数宣言を許可しますが、それは無効であり、それらが行うことは必ずしも一貫しているとは限りません。それを行わないでください。)

匿名関数式

2番目の例のような関数式は、すべての式と同様に、コードのステップバイステップのフローで検出されると発生します。式は、関数の名前を明示的に指定しないため、無名関数式と呼ばれます。ES5以前では、結果の関数に名前がないことを意味していました。ES6 / ES2015以降では、無名関数式で作成された多くの関数には名前があります。これは、名前が式から推測できるためです。これは、関数が変数の名前で終わる例の場合です。foo。無名関数の式は式であるため、式が発生する可能性のある場所であればどこでも発生する可能性がありますが、パーサーにそれを実行していることを警告する必要がある場合もあります。

名前付き関数式

これを行う3番目の方法があります。匿名ではなく名前付き関数式です。彼らはこのように見えます:

var foo = function bar() {
};

また

var obj = {
    foo: function bar() {
    }
};

また

doSomething(function bar() { });

それらは以前は本当に問題のあるクロスブラウザでした(たとえば、IE8以前はそれらを台無しにしました。Safariの初期バージョンには問題がありました。Kangaxには以前の問題の良いページがあります)。これは式なので、式がある場所ならどこでも有効です。関数名(私のbar例では)は、準拠するJavaScriptエンジンによって包含スコープに追加されません。

于 2012-11-10T15:15:34.087 に答える