2

このブログ投稿に記載されてthisいるように、Javascriptの無名関数でスコープを設定できます。

AJAXリクエストthisの無名関数呼び出しでスコープするより洗練された方法はありますか(つまり、を使用していません)?successthat

例えば:

var Foo = {

  bar: function(id) {

    var that = this;

    $.ajax({
      url: "www.somedomain.com/ajax_handler",
      success: function(data) {
        that._updateDiv(id, data);
      }
    });

  },

  _updateDiv: function(id, data) {

    $(id).innerHTML = data;

  }

};

var foo = new Foo;
foo.bar('mydiv');

callを使用しますが、親オブジェクトスコープに名前を付ける必要がありますthat

success: function(data) {
    (function() {
      this._updateDiv(id, data);
    }).call(that);
}
4

2 に答える 2

6

jQuery 1.4 には$.proxyメソッドがあり、次のように簡単に記述できます。

 //...
 bar: function(id) {
    $.ajax({
      url: "someurl",
      success: $.proxy(this, '_updateDiv')
    });
  },
  //...

$.proxy値として使用されるオブジェクトをthis取り、文字列 (そのオブジェクトのメンバー) または関数のいずれかを取ることができ、常に特定のスコープを持つ新しい関数を返します。

別の代替手段はbind関数です。現在、ECMAScript 第 5 版標準の一部が最適です。

//...
  bar: function(id) {
    $.ajax({
      url: "someurl",
      success: function(data) {
        this._updateDiv(id, data);
      }.bind(this)
    });
  },
//...

JavaScript エンジンが ES5 標準を完全に実装すると、この関数はすぐにネイティブで利用できるようになります。現時点では、次の 8 行の長い実装を使用できます。

// The .bind method from Prototype.js 
if (!Function.prototype.bind) { // check if native implementation available
  Function.prototype.bind = function(){ 
    var fn = this, args = Array.prototype.slice.call(arguments),
        object = args.shift(); 
    return function(){ 
      return fn.apply(object, 
        args.concat(Array.prototype.slice.call(arguments))); 
    }; 
  };
}
于 2010-01-24T19:03:38.223 に答える
6

この関数は、コンテキストパラメーター$.ajax()の形式で既にこれを行うための簡潔な手段を提供します。

$.ajax({
  url: "www.somedomain.com/ajax_handler",
  context: this,
  success: function(data) {
    this._updateDiv(id, data);
  }
});

ただし、 CMS で概説されている手法は、一般的な使用により適しています。

于 2010-01-24T19:10:13.210 に答える