7

匿名関数を使用した JavaScript でのプロファイリングに大きな問題があります。私は常に多くの匿名関数を持っています。それらのほとんどはコールバックです。プロファイラーの結果を分析するのは非常に困難です。

最後に、次のように、コールバックに名前付き関数を使用することにしました。

var f = function(callback) {
    // Do something ...
    callback();
}

f(function named_function() {
    console.log('Sample callback function!');
});

コードにこの変更を加えた後、何か問題が発生するかどうかを知りたいですか? そして、このタイプの関数定義と受け渡しは名前 (named_function) を予約しますか?

4

5 に答える 5

10

名前は、名前付き関数式のスコープ内でのみ使用できます。

ただし、IE 8 以下では問題があります。外側のスコープに漏れ、実際には別の関数オブジェクトが作成されるため、問題がある場合は無効にする必要があります。

f(function named_function() {
    console.log('Sample callback function!');
});
var named_function = null;

詳細については、次の記事を参照してください:名前付き関数式の説明

または、このように作成して IE の問題を解決することもできます。

f(function() {
    return function named_function() {
        console.log('Sample callback function!');
    };
}());

しかし、それは少し醜いです。

于 2012-08-27T17:40:24.803 に答える
1

そのような匿名関数を渡すと、名前は関数自体の中に存在します。

他のスコープには存在しません。

var f = function(callback) {
    // Do something ...
    callback();
}

f(function named_function() {
    console.log(named_function); // Logs the function
    console.log('Sample callback function!');
});

console.log(named_function);​ // Error: named_function is undefined
于 2012-08-27T17:39:52.843 に答える
1

複雑にする必要はありません。

宣言するときに関数に名前を付けるだけです

var foo = function foo(){};
于 2012-08-27T17:41:35.710 に答える
0

スコープで名前付きコールバックを定義すると、そのスコープでのみ表示されます。したがって、名前の競合があってはならないと結論付けます。たとえば、次のコードは期待どおりに実行されます。

(function named_callback() { console.log("Callback 1"); })();
(function named_callback() { console.log("Callback 2"); })();​
于 2012-08-27T17:40:01.223 に答える
0

実際には、まだ無名関数式を作成し、それをローカル スコープ変数に割り当てていますf。をやる

function f( callback ) {
    callback();
}

f( named_function );

function named_function() {
    console.log('Sample callback function!');
}

そうすれば、<= IE8 での名前付き関数式のメモリ リークも回避できます。さらに、関数式fを作成するのではなく *function 宣言を作成するため、本体内でアクセスすることもできます。

于 2012-08-27T17:40:34.433 に答える