Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-引用';这';在内部功能中_Javascript_Closures_Anonymous Function - Fatal编程技术网

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()
的文章,以及如何在旧版本浏览器上实现它,因此您可以在那里看到它。但我仍然认为这不是我在回答中提到的方向。