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)
也可以看看:
| 归档时间: |
|
| 查看次数: |
3525 次 |
| 最近记录: |