5

「Faces of」というタイトルのセクションで、一貫性のある慣用的な JavaScript を書くための原則を読むと、JavaScript でのエイリアシングは「非常にバグが発生しやすい」thisことが示唆されます。this

私は個人的に_.bind()可能な限り(または同様のものを)使用しようとしていますが、エイリアシングがなぜthisエラーが発生しやすいのか知っている人はいますか?

4

2 に答える 2

7

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) がこの問題を解決できるようにします。

apply (または call) で呼び出される

として呼び出されmyFunc.apply(obj, args)、 にthisバインドされobjます。任意の呼び出し元がthis独自のスプーフィングされたオブジェクトと交換できるため、これにはセキュリティ上の意味さえあることに注意してください。

于 2013-03-06T18:14:26.513 に答える
4

thisthis特定の状況で何が参照されているかを (開発者にとって) 正確に思い出すのがかなり難しくなるため、あらゆる場所でエイリアスを使用するとバグが発生しやすくなります。これにより、開発者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 呼び出し内からこのクリックされた要素)、何らかの方法でそれへの参照を保持する必要があります。コードでこれをマークしました。

于 2013-03-06T18:13:00.353 に答える