在jQuery实用程序/ ajax方法中设置'this'的匿名函数范围

Gre*_*g K 2 javascript jquery scope anonymous-function

本博文中所述,您可以this在Javascript中设置匿名函数的范围.

在AJAX请求this的匿名函数调用中是否有更优雅的方法作用success(即不使用that)?

例如:

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');
Run Code Online (Sandbox Code Playgroud)

使用调用但仍必须命名父对象范围that.

success: function(data) {
    (function() {
      this._updateDiv(id, data);
    }).call(that);
}
Run Code Online (Sandbox Code Playgroud)

CMS*_*CMS 6

在jQuery 1.4中你有$.proxy方法,你可以简单地写:

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

$.proxy获取一个对象,该对象将用作this值,它可以采用字符串(该对象的成员)或函数,它将返回一个始终具有特定范围的新函数.

另一个替代方案是bind功能,现在ECMAScript第五版标准的一部分是最好的:

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

当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))); 
    }; 
  };
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我想这个问题更多的是个人品味.我喜欢bind方法.我开悟了. (2认同)

Sho*_*og9 6

$.ajax()函数提供了一种简洁的方法,以context参数的形式执行此操作:

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

虽然CMS概述的技术更适合一般用途.