「Faces of」というタイトルのセクションで、一貫性のある慣用的な JavaScript を書くための原則を読むと、JavaScript でのエイリアシングは「非常にバグが発生しやすい」this
ことが示唆されます。this
私は個人的に_.bind()
可能な限り(または同様のものを)使用しようとしていますが、エイリアシングがなぜthis
エラーが発生しやすいのか知っている人はいますか?
「Faces of」というタイトルのセクションで、一貫性のある慣用的な JavaScript を書くための原則を読むと、JavaScript でのエイリアシングは「非常にバグが発生しやすい」this
ことが示唆されます。this
私は個人的に_.bind()
可能な限り(または同様のものを)使用しようとしていますが、エイリアシングがなぜthis
エラーが発生しやすいのか知っている人はいますか?
this
それがどのように呼び出されたかに応じて、4 つの意味を持つことができます。したがって、どれが使用されているかを追跡するように注意する必要があり、それらの少なくとも 3/4 で問題が発生しやすいthis
と考えることができます。this
ではobj.myFunc()
、 にthis
バインドしobj
ます。
myFunc
コールバックで渡された場合、これがオブジェクトの一部であったことを忘れてスタンドアロンで呼び出されるため、これは恐ろしいことです。たとえば、「var that = this;」とは何かを参照してください。JavaScriptでの意味?これに対する通常の回避策。
プレーンmyFunc()
でthis
は、グローバル オブジェクトにバインドします。
Invoked as new myFunc()
(非常に異なる! で呼び出されることを意図したすべての関数はnew
大文字にする必要があるため、疑似クラスのように見える)。新しいオブジェクトを作成してバインドしthis
、(おそらく) そのオブジェクトを返します。
もちろん、 をドロップnew
すると、グローバル オブジェクトにバインドされ、多くのものが破壊され、プログラムが非常に壊れた状態になる可能性があります。大文字化規則は非常に重要であり、JSLint (IIRC) がこの問題を解決できるようにします。
として呼び出されmyFunc.apply(obj, args)
、 にthis
バインドされobj
ます。任意の呼び出し元がthis
独自のスプーフィングされたオブジェクトと交換できるため、これにはセキュリティ上の意味さえあることに注意してください。
this
this
特定の状況で何が参照されているかを (開発者にとって) 正確に思い出すのがかなり難しくなるため、あらゆる場所でエイリアスを使用するとバグが発生しやすくなります。これにより、開発者this
は、実際にはまったく別のものであるにもかかわらず、1 つの要素を参照していると信じ込んでしまう可能性があります。例えば:
$('#something').click ( function (e) {
//this refers to the clicked element
var _this = this; //Tracking a reference to the clicked element `this`
$.each(someArray, function(index, value) {
//this refers to the current element being iterated in someArray
$.ajax({
url : 'some/path',
success: function (res) {
//this refers to the ajax request
//_this still references the clicked element
}
})
})
})
this
さらに、別のスコープ内から1 つにアクセスする必要がある場合this
(たとえば、ajax 呼び出し内からこのクリックされた要素)、何らかの方法でそれへの参照を保持する必要があります。コードでこれをマークしました。