为什么这个闭包不能访问’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
访问