为什么ajax调用中的闭包可以访问外部范围?
我读过关于JavaScript关闭的内容,我以为我明白了,但显然我没有。为什么ajax调用中的闭包可以访问外部范围?
成功功能在请求成功时被调用。这意味着,当封闭(function() { return obj; })();
执行范围内成功功能,是不function (evt) {...}
了,所以它是如何仍然可以访问OBJ?
如何在这个例子中,堵口
EDITED(有OBJ前VAR)
function (evt) {
var obj = evt.data.obj,
$.ajax({
type: "POST",
url: url,
data: data,
success: function() {
var o = (function() {
return obj;
})();
}
});
}
在JS中,范围受函数限制。
变量作用域所在的函数内部的所有内容都可以访问该变量 - 包括其他函数 - 除非在较窄范围内存在另一个同名变量。
编辑问题后删除也就是说,在这个例子中,没有
var
关键字本地化obj
的范围,无论如何,所以它是一个全球性的。
一种方式来看待它是关闭访问所有范围高于自己。
另一种方式是说,实际上obj
是在功能function(evt)
,这是父母的function()
范围范围访问,因此,obj
也从function()
访问。
无论哪种方式,这都是JavaScript的工作方式:闭包有权访问闭包定义点处的所有内容。
一个关闭有权访问所有更高的范围,不仅是“父范围”。
由于obj
变量未在当前作用域中定义,所以JavaScript会遍历函数有权访问的所有作用域,直到找到它。
这就像有人仰望一个非常奇怪的阶梯;一个可以分裂成分梯子,但是当你爬下这些分梯子时,你仍然处在更大的阶梯中。
闭包在设计时可以访问周围范围,因为它是在范围内创建的。
您在外部作用域中访问的任何变量都可以通过一个引用来访问,该引用会在创建该作用域的作用域被销毁后保持该变量有效。
这种方式当闭包执行时,它所引用的变量仍然存在,只有在闭包被处置后才会释放变量。
每个Function对象都有一个表示它的执行上下文的Activation对象。
在一组嵌套函数中,作用域链从最内层的Activation对象开始到Global对象(Global Scope)结束。
因此,除非变量之间存在名称冲突,否则除全局变量外,每个函数都可以访问它的所有父函数的局部变量和参数。
Here是一个漫长但非常有用的解释。
抱歉误导,但在** obj **变量之前有** var **关键字 – theateist 2011-05-03 12:41:58