1

: コードは長く見えますが、デモ用の単純な疑似コードです。逃げるな!

キーの押下をリッスンするウィジェットを作成しました。onKeyDownイベントが発生すると、への参照がthis失われます。selfそこで、ウィジェットを参照するために 呼び出されるスコープ変数を設定しました。selfウィジェットの作成時に初期化されます。

これは機能しますが、これが正しいアプローチであるかどうかはわかりません。ここでの解決策は、プロキシを使用することだと思いますか? おそらく、self変数はすでにプロキシとして機能していますか? 何が起こっているのかを明らかにしたい人はいますか?

(function($)
{   
    var vendorPrefix = Modernizr.prefixed("transform");
    var self;

    $.widget("ui.myWidget", {

        _create: function()
        {  
            self = this;            
            //Do some widget stuff  
            document.addEventListener('keydown', this.onKeyDown, false)
            return this;
        },

        exampleFn: function()
        {
        },

        onKeyDown: function(event)
        {
            // this now refers to "document" and not the widget             
            switch(event.keyCode)
            {
                case 37: 
                    self.exampleFn();
                    break;
                case 39:
                    self.exampleFn();
                    break;
            }
        }

    });
})(jQuery);
4

3 に答える 3

1

変数を削除したい場合は、jQuery.proxy()を使用することもできます。self

onKeyDown: $.proxy(function(event)
{
    // this now refers to "document" and not the widget             
    switch(event.keyCode)
    {
        case 37: 
            this.exampleFn();
            break;
        case 39:
            this.exampleFn();
            break;
    }
}, this)

とにかく、何が起こっているかとthisいうと、in a function がその関数を参照しているということです。そのthisため、関数ですonKeyDownonKeyDown上記のようにプロキシを使用すると、thisinonKeyDownは親関数への参照になります。

thisJavaScriptでの動作の詳細: 「this」キーワードはどのように機能しますか?

于 2012-09-06T16:44:39.607 に答える
0

これは、"this" キーワードが、イベントが関連付けられているオブジェクトを参照するためです。

セルフ チップを使用することをお勧めします。

于 2012-09-06T16:28:34.793 に答える
0

JavaScriptにはそのようなものがないため、プロキシの意味がわかりませんが、基本的にグローバル変数を作成したため、プロキシの正しい方法ではありません。

たとえば、ウィジェットが複数回初期化された場合、コードによっては非常に奇妙な動作が見られる可能性があります。

グローバルを取り除き、オブジェクト宣言内のメソッドのvar self上に移動して、そのオブジェクトのプライベート変数にします。_create

于 2012-09-06T16:41:28.890 に答える