2009-10-27 11 views
6

あなたは、このようなコードを実行した場合、例えばjQueryのフレームワークを撮影:名前付き関数はJavaScriptで過小評価されていますか?

$(document).ready(function init() { foo.bar(); }); 

あなたはFirebugの中で取得するスタックトレースは次のようになります。あなたが見ることができるように

init() 
anonymous() 
anonymous([function(), init(), function(), 4 more...], function(), Object name=args) 
anonymous() 
anonymous() 

、それはとてもではありませんあなたはそれが何であるかを見つけるために各機能をクリックしなければならないので、読みやすい。匿名関数もプロファイラに(?)()と表示され、 "cannot access optimized closure"のバグにつながる可能性があります。これらが避けなければならない理由は私にはあるようです。 ECMAScript 5が厳密なモードでarguments.calleeを非難するという事実があります。つまり、匿名の関数を参照することはできず、将来の証明にはなりません。

var Foo = { 
    bar: function bar() {} 
} 

function Foo() {} 

Foo.prototype.bar = function bar() {} 

が、私はこの繰り返しは、名前の関数が提供するデバッグの利便性の観点から正当化されていることを考えるに修正アム、及び有病率があること:という名前の関数を使用して、一方

は、例えば、繰り返しにつながることができますjQueryのような良いフレームワークでの匿名関数の監視は見落としですか?

答えて

3

このvery informative articleの質問に答えが見つかりました。まず、名前付き関数のほうが望ましいとわかりましたが、解決策はすべての匿名関数に識別子を追加するだけでは簡単ではありません。この主な理由は、JScriptが非常に壊れた方法で関数式を実装しているためです。

第2に、関数ステートメントと式が区別されます。無名関数は、識別子を省略した関数式に過ぎず、識別子を付け加えてもそれを文にすることはできません(JScriptでは例外です)。これは、他のすべての回答がオフマークであったことを意味します。

+2

残念ながら、その記事へのリンクはもう機能していません。しかし、同じ記事はここで見つけることができます:http://kangax.github.com/nfe/ – Jan

1

私にとっては、匿名機能はソースコードで読みやすくなっています。なぜなら、彼らはそこでしか使われていないと確信しているからです。

3

JavaScript/EMCAScriptで匿名メソッドを使用することには、いくつかの欠点があることに同意します。しかし、それらをどのように使用すべきか見落とさないでください。他の関数に渡したい単純なライナーの場合、しばしば優れています。

+1

本当に長い名前を使用していて、単語の折り返しを付けていない限り、名前付き関数の使用には行を追加する必要はありません。 – slikts

+1

それは必要ありませんが、時には非常に便利です。関数が実際に名前を必要としないことがあります。なぜそれを与える? –

0

匿名機能は非常に便利です。関数の名前を指定するのではなく、この問題を解決するには、ファイルのどの行に匿名関数が作成されたかをfirebugから通知してください。

init() 
anonymous() // application.js, line 54 
anonymous() // foo.js, line 2 

スタックトレースは、匿名機能が問題となる唯一の場所です。

+0

私は他の3つの問題に匿名関数の名前を付けましたが、Firebugは行番号を報告します。 – slikts

+0

"imo"を書き留めます。 –

関連する問題