JavaScript - 在内部函数中引用'this'

时间:2011-11-14 14:02:23

标签: javascript closures anonymous-function

请考虑以下代码:

MyClass.prototype.my_func = function () {
    this.x = 10;
    $.ajax({
        // ...
        success: function (data) {
            alert(this.x);
        }
    });
}

它不起作用,因为显然this没有绑定到闭包的执行上下文中。我已经能够通过引入另一个变量来解决它:

var _this = this;

这适用于匿名函数。但对我来说看起来很难看。有没有一个很好的方法来处理这个?

4 个答案:

答案 0 :(得分:2)

对于你来说,这可能看起来像是一个丑陋的解决方案,并且有一些解决方法(例如using bind() method来改变上下文),但这是我所知道的最佳解决方案。

或者您可以将其更改为:

var self = this;

或者给它更有意义的名字,但是更好(在这种情况下)不要改变上下文,因为有一天你可能需要它。

答案 1 :(得分:1)

您可以使用Function.prototype.bind

MyClass.prototype.my_func = function () {
    this.x = 10;
    $.ajax({
        // ...
        success: function (data) {
            alert(this.x);
        }.bind(this);
    });
}

现在,父上下文变量也绑定到匿名函数。

答案 2 :(得分:0)

this语法通常是指对象,而不是函数。在您的情况下,this指的是 MyClass

如果您在对象中使用变量,则可能忘记在x中定义MyClass

如果您只在函数中使用变量,我将使用var语法定义变量。函数结束时,函数中定义的变量将被销毁。

MyClass.prototype.my_func = function () {
    var x = 10;

    $.ajax({
        // ...
        success: function (data) {
            alert(x);
        }
    });
}

答案 3 :(得分:0)

闭包可以访问其父上下文中定义的所有对象。如果我们有:

function() {
  var x = 10;
}

然后这是有效的:

function() {
  var x = 10;

  (function() {
    alert(2*x); // 20
  }())
}

因此,当您定义var _this = this时,您只在父级的上下文中定义了一个在闭包中可用的新变量。有关此“模式”的更多信息,请参阅question #4371333