7

私はこのようなものを持っています:

var Something = function(){
  this.render = function(){};
  $(window).resize(function(){
    this.render();
  });
}

問題は、無名関数内で「this」がウィンドウオブジェクトを参照していることです。私は次のようなことができることを知っています:

var Something = function(){
  this.render = function(){};
  var tempThis = this;
  $(window).resize(function(){
    tempThis.render();
  });
}

しかし、もっと良い方法はありますか?これはあまりエレガントに見えません。

4

6 に答える 6

14

あなたが見つけた解決策は、ほとんどの人が使用するものです。一般的な規則は、tempThis変数を「that」と呼ぶことです。

var Something = function(){
  this.render = function(){};
  var that = this;
  $(window).resize(function(){
    that.render();
  });
};
于 2009-06-25T12:14:45.740 に答える
2

それはあなたの最良の選択肢のように見えます、私はより良い方法があるとは思いません。(私が間違っている場合、誰かが私の修正をします)。

于 2009-06-25T12:08:58.750 に答える
1

参考までに、これを制御する機能は、JQueryの次のバージョンで提供されます

于 2009-06-25T12:19:58.570 に答える
0

私は多くの厳しい状況でこのようにやっています。エレガントには見えませんが、失敗することはありません。実際には、JavaScriptクロージャが実際に動作しています。

jrh

于 2009-06-25T12:12:59.677 に答える
0

それはまさに私がしていることです。jQueryに固有のものでもありません。

var Construct = function() {
    var self = this; //preserve scope

    this.materials = 2000;

    this.build = function(){
        self.materials -= 100;
    };
};

新しいスコープ変数の前でvarキーワードを使用することを忘れないでください。それ以外の場合は、新しいグローバル変数を作成しています。ローカル変数として、クロージャを介して内部関数内で引き続きアクセスできます。

于 2009-06-25T12:21:16.930 に答える
0

変数を最小限に抑えるための最善の解決策は、Function.prototype.bind()メソッドを使用することです。

var Something = function(){
  this.render = function(){};
  $(window).resize( this.render.bind( this ) );
}

将来の問題を引き起こす可能性のあるこのメソッドの問題は、慎重に使用することを選択する必要があることを意味し$(this)、要素を取得するために呼び出す必要がある場合です。したがって、サイズ変更メソッドで使用する価値があると思われるFunction.prototype.bind()かもしれませんが、クリックされた要素を直接ターゲットにする必要があるクリック関数で使用するのは良い解決策ではありません。

実用的な例については、このJSFiddleを参照してください。

詳細については、Function.prototype.bind()に関するMozillaのドキュメントを参照してください。

他の方法も使用できますが、このコンテキストを維持するために変数を作成することは、あなたの質問によると望ましくない効果です。

于 2014-05-06T14:25:39.537 に答える