请考虑以下代码:
MyClass.prototype.my_func = function () {
this.x = 10;
$.ajax({
// ...
success: function (data) {
alert(this.x);
}
});
}
它不起作用,因为显然this
没有绑定到闭包的执行上下文中。我已经能够通过引入另一个变量来解决它:
var _this = this;
这适用于匿名函数。但对我来说看起来很难看。有没有一个很好的方法来处理这个?
答案 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。