为什么这个闭包不能访问'this'关键字? - jQuery

the*_*laf 14 javascript jquery closures this

我是闭包的初学者(以及一般的Javscript),我无法找到关于此代码中发生了什么的令人满意的解释:

function myObject(){
    this.myHello = "hello";
    this.myMethod = do_stuff;
}

function do_stuff(){
    var myThis = this;
    $.get('http://example.com', function(){
        alert(this.myHello);
        alert(myThis.myHello);
    });
}

var obj = new myObject;
obj.myMethod();
Run Code Online (Sandbox Code Playgroud)

它会提醒'undefined'然后'hello'.显然这不应该是特定于jQuery的,但这是我能想到的最原始代码的最简单形式.闭包do_stuff()可以访问该范围内的变量,但显然此规则不适用于this关键字.

问题:

发生什么this时,闭合的范围之外传递do_stuff()(在这种情况下$.get())?是否myThis包含它的副本this或引用?this在封闭中使用通常不是一个好主意吗?

任何回应都非常赞赏.

CMS*_*CMS 10

当闭包在do_stuff()范围之外传递时(在这种情况下是$ .get())会发生什么?

每个函数都有自己的执行上下文,this关键字检索当前上下文的值.

doStuff标识符和obj.myMethod属性指代相同功能的对象,但由于要调用它作为一个对象(的特性obj.myMethod();),则this该函数内部值,将参考obj.

当Ajax请求成功时,jQuery将调用第二个函数(启动新的执行上下文),它将使用包含用于请求的设置的对象作为该this回调的值.

myThis是否包含此副本或对其的引用?

myThis标识符将包含一个参考到也由所引用的对象this上的外部范围的值.

在封闭中使用它通常不是一个好主意吗?

如果您了解如何this隐式处理该值,我看不出任何问题......

由于您使用的是jQuery,因此您可能需要检查 jQuery.proxy方法,是一种可用于保留函数上下文的实用程序方法,例如:

function myObject(){
    this.myHello = "hello";
    this.myMethod = do_stuff;
}

function do_stuff(){
    $.get('http://example.com', jQuery.proxy(function(){
        alert(this.myHello);
    }, this)); // we are binding the outer this value as the this value inside
}

var obj = new myObject;
obj.myMethod();
Run Code Online (Sandbox Code Playgroud)

也可以看看: