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

我是闭包的初学者(和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(); 

它会提醒’undefined’然后’hello’。 显然这不应该是特定于jQuery的,但这是我能想出的最原始代码的最简单forms。 do_stuff()的闭包可以访问该作用域中的变量,但显然此规则不适用于this关键字。

问题:

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

任何回应都非常赞赏。

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

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

doStuff标识符和obj.myMethod属性引用相同的函数对象,但由于您将其作为对象的属性( obj.myMethod(); )调用,因此this函数内的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(); 

也可以看看:

  • 没有黑客攻击,私有JavaScript函数无法访问’this’对象?
 $.get('http://example.com', function(){ alert(this.myHello); // this is scoped to the function alert(myThis.myHello); // myThis is 'closed-in'; defined outside }); 

注意匿名function。 这个范围就是函数的范围。 myThis是外部范围的内容,其中定义了myHello。 在firebug中查看。

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

 $.get('http://example.com', function(){ // inside jQuery ajax functions - this == the options used for the ajax call }); 

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

没有“发生”它,这仍然是闭包 ,从闭包调用的函数的执行上下文不会自动inheritancethis

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

所有非标量赋值都是JavaScript中的引用。 所以它是对此的引用,如果你改变其中的属性,它们都会改变。

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

在闭包中使用它通常是一个好主意,但是如果你将要使用内部需要访问相同的闭包,那么它的良好做法就是完全按照你所做的去做: var someName = this; 然后使用someName访问