0

私は自分の JS スキルを向上させようとしていて、名前空間付きのオブジェクト リテラルとして一連のコードを書き直しました (と思います)。しかし、今は "this" 関連の問題があります。私が理解するのを手伝ってください?

ここに短縮コードがあります。

var MYAPP = {

    init: function(){
        $(document).on("click",".showLove", MYAPP.showLove);
    },
    showLove: function(){
         var thisId = MYAPP.findId();
         $.post(//// do AJAXy stuff using thisId);
    },
    findId: function(){
        var thisClass = $(this).attr('class');
        var thisIdPos = thisClass.indexOf("id-")+3;
        var thisId = thisClass.substr(thisIdPos, 3);
        return thisId;
    }
}

だから私はあなたがおそらく問題を見ていると確信しています。findId 関数では $this が定義されておらず、エラーが発生します。以前は、showLove に findId ロジックがあり、すべてが機能していました。いくつかの異なる場所で使用されていたため、findId ロジックを独自のメソッドに移動しました。

だから私はこれを聞いてみましょう - > $(this) が 'showLove' の正しい要素を指しているのはなぜですか? 'findId' は 'showLove' 内から呼び出されるため、$(this) を含む同じ変数にアクセスするべきではありませんか? 初めての「自分=これ」のシチュエーション?

これが基本的な質問であることはわかっていますが、誰かが私を理解するのを手伝ってくれるなら、私は..ええと..「愛を示す」.

4

4 に答える 4

1

これを維持したい場合は、する必要があります

MYAPP.findId.call(this);
于 2013-01-09T14:47:44.237 に答える
1

問題は、 findId関数をどのように呼び出しているかにかかっていると思います。これを行うときはいつでも:

MYAPP.findId()

オブジェクトのコンテキストなしで実行される関数を静的に参照しています。そのコンテキストを保持したい場合は、次のように呼び出す必要があります。

MYAPP.findId.call(this)

そうすることで、findId 内の this 変数は、呼び出し関数にパラメーターとして渡すオブジェクトにバインドされます (この場合、現在のthisあるため、その参照を保持しています)

余談ですが、underscore.js の bind 関数を確認することをお勧めします。これは非常に便利なヘルパーです。

于 2013-01-09T14:52:53.050 に答える
1

thisshowLove は、$(document).on("click",".showLove", MYAPP.showLove);

var thisId = MYAPP.findId(this);// 関数に渡す

findId: function(thisPassed){その名前で参照する

少なくともそれを行う1つの方法。

于 2013-01-09T14:48:39.420 に答える
1

あなたはMYAPP.showLovejQueryに渡して、「この関数をクリックハンドラーとしてドキュメントに添付してください」と言っています。

これを行うと、名前空間への参照なしでfunctionを渡すだけなので、は にアタッチされていたことをMYAPP.showLove 忘れます。MYAPP

したがって、showLoveクリック ハンドラーとして実行されると、thisはもはやMYAPP. 通常、オブジェクトから関数をデタッチすると、または(ES5)のthisいずれかになります。ただし、jQuery は、またはを使用して、クリックされた要素である必要があると判断します。windowundefinedthis.showLovecall()apply()

ただし、電話MYAPP.findId()をかけると、まだに設定されています。それがアタッチされているためです(でメソッド呼び出しています)。showLovethisMYAPPfindId MYAPP

thisこれを修正するには (しゃれた意図はありません)、 to findId(推奨、IMO)の値を渡すか、 call()/を使用しますapply()

var MYAPP = {

    init: function(){
        $(document).on("click",".showLove", MYAPP.showLove);
    },
    showLove: function(){
         var thisId = MYAPP.findId(this);
         $.post(//// do AJAXy stuff using thisId);
    },
    findId: function(which){
        var thisClass = $(which).attr('class');
        var thisIdPos = thisClass.indexOf("id-")+3;
        var thisId = thisClass.substr(thisIdPos, 3);
        return thisId;
    }
}

また:

var MYAPP = {

    init: function(){
        $(document).on("click",".showLove", MYAPP.showLove);
    },
    showLove: function(){
         var thisId = MYAPP.findId().call(this);
         $.post(//// do AJAXy stuff using thisId);
    },
    findId: function(){
        var thisClass = $(this).attr('class');
        var thisIdPos = thisClass.indexOf("id-")+3;
        var thisId = thisClass.substr(thisIdPos, 3);
        return thisId;
    }
}
于 2013-01-09T14:48:41.973 に答える