Javascript 为什么';t此关闭是否可以访问';这';关键词?-jQuery

Javascript 为什么';t此关闭是否可以访问';这';关键词?-jQuery,javascript,jquery,closures,this,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);

我是闭包(以及一般的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();
它会先警告“未定义”,然后警告“你好”。显然,这不应该是特定于jQuery的,但这是我可以想到的最简单的原始代码形式。
do_stuff()
中的闭包可以访问该范围内的变量,但显然此规则不适用于
this
关键字

问题:

当闭包被传递到
do_stuff()
(在本例中为
$.get()
)的范围之外时,此
会发生什么情况?
myThis
是否包含该
的副本或引用?在闭包中使用
this
通常不是一个好主意吗

非常感谢您的回复

$.get('http://example.com', function(){
    alert(this.myHello);  // this is scoped to the function
    alert(myThis.myHello);  // myThis is 'closed-in'; defined outside
});
注意匿名函数。该范围中的这一部分是函数的范围。myThis是外部范围的一部分,myHello是在外部范围中定义的。在firebug中查看它

“这”总是指目前的执行范围,我相信。如果要获取并保留当前作用域,可以执行所做的操作,即将其分配给另一个变量

当闭包被传递到do_stuff()的范围之外(在本例中为$.get())时,会发生什么情况

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

doStuff
标识符和
obj.myMethod
属性引用同一个函数对象,但由于您将其作为对象的属性调用(
obj.myMethod();
),因此该函数中的
值将引用
obj

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

myThis是否包含此文档的副本或引用

myThis
标识符将包含对对象的引用,该对象也由外部范围上的
值引用

在闭包中使用此选项通常不是一个好主意吗

如果您了解如何隐式处理
这个
值,我看不出有任何问题

由于您使用的是jQuery,您可能需要检查该方法,它是一种可用于保留函数上下文的实用方法,例如:

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();
另见:

当闭包被传递到do_stuff()的范围之外(在本例中为$.get())时,会发生什么情况

它没有“发生”任何事情,这仍然是该闭包的,从闭包调用的函数的执行上下文不会自动继承该闭包

myThis是否包含此文档的副本或引用

所有非标量赋值都是JavaScript中的引用。因此,它是对该
的引用,如果您更改其中一个的属性,它们将同时更改

在闭包中使用此选项通常不是一个好主意吗


通常,在闭包中使用
this
是一个好主意,但是如果您要在内部使用需要访问相同
this
的闭包,那么最好的做法是完全按照您所做的操作:
var someName=this
然后使用
someName访问

我本想问一个后续问题,但你最近的编辑回答了这个问题。谢谢
$.get('http://example.com', function(){
   // inside jQuery ajax functions - this == the options used for the ajax call
});