4

編集:それは名前付き変数への関数宣言の割り当てではありません-受け入れられた答えを確認してください。他の人が私と同じ間違いをするかもしれないので、タイトルをそのままにしておきます。


PaulIrishのinfinitescrolljqueryプラグインコードを読んでいるときに、次のパターンに何度も遭遇しました。

...
_create : function infscr_create (options, callback) { /* ... */ },
...

次の代わりにこれを行うことの利点は何ですか?

...
_create : function (options, callback) { /* ... */ },
...
4

2 に答える 2

6

その利点(「名前付き関数式」と呼ばれる)は、関数に実際の名前があることです。2番目のバージョンでは、プロパティに名前がありますが、関数には名前がありません。関数に実際の名前を付けると、ツールが役立ちます(スタックリスト、ブレークポイントリストなどを呼び出します)詳細:匿名匿名

これの欠点は、IE8以前のようなJavaScriptエンジンが壊れて予期しない結果になることです。IE8以前では、PaulIrishのバージョンは2つの完全に異なる時間に2つの別々の関数を作成します。ただし、両方への参照を保持して使用し、それらが同じ関数であると期待しない限り、実際には問題にはなりません(たとえば、イベントハンドラーをフックアップおよびフック解除する場合)。ポールだとすれば、彼はそうしないと確信していると思います。


質問のタイトルについて:これは関数宣言ではないことに注意してください。ただし、関数宣言とほぼ同じように見えるため、関数宣言であると考えることは許されます。:-)これは関数です。関数宣言と関数式は完全に異なる時間に発生し、それらが作成されるスコープに異なる影響を及ぼします。

完全を期すために:

// This is a function declaration -- note that it's not a "right-hand
// value", e.g., we're not using the result of it immediately (via an
// assignment, a property initializer, calling it, or passing it into
// a function as an argument -- none of those).
//
// Declarations happen upon entry to the scope (not as part of step-by-
// step code). The function's name is added to the scope in which it's
// declared. Declarations are illegal inside branches (`if`, `try/catch`,
// `for`, etc.), but some engines will rewrite them as expressions for
// you if you do that. Others will not, they'll just always declare the
// function regardless of whether the code was reached. So don't do that.
function foo() {
}

// These are all anonymous function expressions. The function in the
// expression has no name, although some debuggers are pretty smart
// about looking at the expression and (where they can) listing a
// kind of pseudo-name for the function. Others are not that smart,
// which is why I avoid anonymous functions.
//
// Expressions happen when they're reached in step-by-step code.
var f = function() { };
var obj = {
    prop: function() { }
};
doSomethingCoolWithAFunction(function() { });
(function() { })(); // Call it immediately
!function() { }();  // Call it immediately
~function() { }();  // Call it immediately, there are a few variants

// These are all *named* function expressions.
//
// Since they're expressions, they happen when they're reached in the
// step-by-step code. The function's name is NOT added to the containing
// scope (except by engines with bugs).
//
// These are the same examples as above, but with a name. No other changes.
var f = function foo() { };
var obj = {
    prop: function foo() { }
};
doSomethingCoolWithAFunction(function foo() { });
(function foo() { })(); // Call it immediately
!function foo() { }();  // Call it immediately
~function foo() { }();  // Call it immediately, there are a few variants
于 2012-07-05T10:20:57.753 に答える
5
  1. 関数には、匿名関数ではなく名前があります。これはデバッグトレースに表示され、デバッグが容易になります。
  2. 関数は、を呼び出すことによってそれ自体を呼び出すことができますinfscr_create()
于 2012-07-05T10:21:20.640 に答える