JavaScript-引用';这';在内部功能中
考虑以下代码:JavaScript-引用';这';在内部功能中,javascript,closures,anonymous-function,Javascript,Closures,Anonymous Function,考虑以下代码: MyClass.prototype.my_func = function () { this.x = 10; $.ajax({ // ... success: function (data) { alert(this.x); } }); } 它不起作用,因为显然这个没有绑定到闭包的执行上下文中。我已经能够通过引入另一个变量来解决这个问题: var _this = this; 这在匿
MyClass.prototype.my_func = function () {
this.x = 10;
$.ajax({
// ...
success: function (data) {
alert(this.x);
}
});
}
它不起作用,因为显然这个没有绑定到闭包的执行上下文中。我已经能够通过引入另一个变量来解决这个问题:
var _this = this;
这在匿名函数中起作用。但是在我看来很难看。有什么好办法处理这个问题吗?您可以使用Function.prototype.bind
来解决这个问题:
MyClass.prototype.my_func = function () {
this.x = 10;
$.ajax({
// ...
success: function (data) {
alert(this.x);
}.bind(this);
});
}
现在,父上下文变量也绑定到匿名函数。这对您来说可能是一个丑陋的解决方案,并且有一些演练(例如更改上下文),但这是我所知道的最好的解决方案
或者,您可以将其更改为:
var self = this;
或者给它起一个更有意义的名字,但是(在本例中)最好不要更改上下文,因为有一天您可能会需要它。这个语法通常指的是对象,而不是函数。在您的例子中,这个
指的是MyClass
如果在对象中使用变量,则可能忘记在MyClass
中定义x
如果只在函数中使用变量,我将使用var
语法定义变量。函数结束时,函数中定义的变量将被销毁
MyClass.prototype.my_func = function () {
var x = 10;
$.ajax({
// ...
success: function (data) {
alert(x);
}
});
}
闭包将有权访问在其父上下文中定义的所有对象。因此,如果我们有:
function() {
var x = 10;
}
那么这是有效的:
function() {
var x = 10;
(function() {
alert(2*x); // 20
}())
}
因此,当您定义var\u this=this
时,您仅在父级上下文中定义了一个新变量,该变量在闭包中可用。有关此“模式”的更多信息,请参阅。我认为您建议的解决方案--var\u this=this代码>--是标准的变通方法。标准变通方法使用变量,而该变量为
:P@LukeH我甚至不会把它称为@Andy的一个可行的复制品:嗯,这是很有可能的.bind()
是ES5规范中的新版本,因此旧版本浏览器可能不支持它。@Andy:在我的回答中,我提供了一个链接,指向MDN关于bind()
的文章,以及如何在旧版本浏览器上实现它,因此您可以在那里看到它。但我仍然认为这不是我在回答中提到的方向。