2012-08-27 8 views
5

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

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

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

私は私のコードでこの変更を行った後に何か問題があるということを知りたい:

は最後に、私はこのように、コールバックに名前の関数を使用することを決めましたか? そして、このタイプの関数定義と渡しは名前(named_function)をどこにでも確保しますか?

答えて

8

名前は、指定された関数式のスコープ内でのみ使用できます。

しかしIE 8以降では問題があります。それは外側のスコープに漏れ、実際には別の関数オブジェクトを作成するので、それが問題であれば無効にする必要があります。

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

詳細については、こちらの記事を参照してください:Named function expressions demystified

それとも、IEの問題を解決するために、このようにそれを作成することができます。

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

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

0

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

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

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 
0

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

(function named_callback() { console.log("Callback 1"); })(); 
(function named_callback() { console.log("Callback 2"); })();​ 
0

実際には、という匿名の関数式を作成し、それをローカルスコープ変数fに割り当てています。 、あなたも< = IE8でという名前の関数式メモリリークを回避している

function f(callback) { 
    callback(); 
} 

f(named_function); 

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

その方法のために行く、プラスあなたはもはや関数式が、*関数宣言を作成していることから、あなた体内のfにアクセスすることもできます。

+0

それを宣言するとき、私はそれは無名関数だと言うではないでしょう機能に名前を付けます。現在のスコープ内にシンボルを作成しませんが、関数には名前があります:) –

1

あなたは物事を複雑にする必要はありません。

ちょうどあなたが

var foo = function foo(){}; 
関連する問題