Javascript函数范围

时间:2011-08-23 02:40:05

标签: javascript jquery

我正在尝试从jQuery ajax调用中调用实例方法a()。但是当我这样做时,它说该方法没有定义。我认为这是因为a()不在$的范围内。但我认为它将成为范围链的一部分。 a()如何在范围内?

function Z() {
    this.x = 0
    this.a = function() {
      return this.x;   
    }
    this.b = function() {
        $.ajax({
            ...
            success: function(data, textStatus, xhr) {
                this.a(); //a() is not defined
            },
            ...
        }); 
    }  
}

z = new Z();
z.b();

7 个答案:

答案 0 :(得分:3)

大多数人都会提出像var that = this;这样的技巧,但我更喜欢使用功能绑定来更优雅,更清晰地实现相同目的。

创建一个本地函数athis.a绑定到this

function Z() {
    this.x = 0
    this.a = function() {
      return this.x;   
    }
    this.b = function() {
        var a = this.a.bind(this);
        $.ajax({
            ...
            success: function(data, textStatus, xhr) {
                a();
            },
            ...
        }); 
    }  
}

z = new Z();
z.b();

答案 1 :(得分:2)

其他解决方案几乎肯定会起作用,但是使用jQuery做一个更加流畅,更惯用的方法:使用context option with $.ajax()

  

上下文

     

此对象将成为所有与Ajax相关的回调的上下文。默认情况下,上下文是一个对象,表示调用中使用的ajax设置($.ajaxSettings与传递给$.ajax的设置合并)。


$.ajax({
    ...
    context: this,
    success: function(data, textStatus, xhr) {
        this.a(); //a() is now defined :)
    },
    ...
}); 

答案 2 :(得分:2)

没有“那个”技巧,改变context of the ajax callbacks

            context: this,
            success: function(data, textStatus, xhr) {
                this.a(); //a() is not defined

答案 3 :(得分:1)

试试这个:

function Z() {
    var that=this;
    this.x = 0
    this.a = function() {
      return that.x;   
    }
    this.b = function() {
        $.ajax({
            ...
            success: function(data, textStatus, xhr) {
                that.a(); //a() is not defined
            },
            ...
        }); 
    }  
}

z = new Z();
z.b();

答案 4 :(得分:1)

你不能在回调函数中使用'this'。

function Z() {
var that=this;
this.x = 0
this.a = function() {
  return this.x;   
}
this.b = function() {
    $.ajax({
        ...
        success: function(data, textStatus, xhr) {
            that.a(); //a() is not defined
        },
        ...
    }); 
}  }

答案 5 :(得分:0)

var that=this;使用that.a。内部函数/对象无法使用this,您必须使用that=this技巧。

答案 6 :(得分:0)

调用this时,

this.a()是jQuery Ajax对象。你需要做这样的事情:

function Z() {
    this.x = 0
    this.a = function() {
      return this.x;   
    }
    this.b = function() {
        var that = this;
        $.ajax({
            ...
            success: function(data, textStatus, xhr) {
                that.a(); //a() is not defined
            },
            ...
        }); 
    }  
}

z = new Z();
z.b();