質問

たとえば、jQueryフレームワークを使用して、次のようなコードを実行する場合:

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

Firebugで取得するスタックトレースは次のようになります。

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

ご覧のとおり、各関数をクリックしてその内容を確認する必要があるため、あまり読みやすくありません。匿名関数は、プロファイラーに(?)()として表示され、" 最適化されたクロージャーにアクセスできません"バグ。これらはそれらを避ける良い理由であるように思えます。それから、ECMAScript 5は厳密モードで arguments.callee を非推奨にするという事実があります。つまり、匿名関数を参照することは不可能であり、将来の保証が少し少なくなります。

一方、名前付き関数を使用すると、繰り返しが発生する可能性があります。例:

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

function Foo() {}

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

この繰り返しは、名前付き関数が提供するデバッグの利便性を考慮して正当化され、jQueryのような優れたフレームワークでの匿名関数の普及は見落としであると考えるのは正しいですか?

役に立ちましたか?

解決 2

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

第二に、関数ステートメントと式には区別があります。匿名関数は、識別子が省略された単なる関数式であり、識別子の追加(名前の付け方)はステートメントになりません(JScriptを除き、壊れている理由です)。これは、他のすべての回答がオフマークだったことを意味します。

他のヒント

JavaScript / EMCAScriptで匿名メソッドを使用することには、いくつかの欠点があることに同意します。ただし、それらの使用方法を見落とさないでください。別の機能に渡したい単純な1つのライナーの場合、多くの場合優れています。

しかし、私にとっては匿名関数はソースコードでより読みやすくなっています。

匿名関数は非常に便利です。関数に名前を付ける代わりに、この問題をより適切に修正するには、firebugが匿名関数が作成されたファイルの行を教えてくれます。

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

そして、匿名トレースが問題になる唯一の場所はスタックトレースです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top