我读到了关于JavaScript闭包的内容,我认为我理解它,但显然我没有。
请求成功时调用成功功能。这意味着当执行闭包(function () {
return obj;
})();
时,成功函数内的范围已经不 function (evt) {...}
,因此它仍然可以访问 OBJ
此示例中的闭包如何工作
已编辑( obj 之前 var )
function (evt) {
var obj = evt.data.obj,
$.ajax({
type: "POST",
url: url,
data: data,
success: function () {
var o = (function () {
return obj;
})();
}
});
}
答案 0 :(得分:3)
在JS中,范围受功能限制。
变量作用域的函数内部的所有内容都可以访问该变量 - 包括其他函数 - 除非在较窄的范围内有另一个同名变量。
编辑问题后删除这就是说,在这个例子中,没有 var
关键字来定位obj
的范围,所以它是一个全局的。
答案 1 :(得分:1)
查看它的一种方法是,闭包可以访问自己以上的所有范围。
另一种方式是,obj
实际上 可以在function(evt)
范围内访问,function()
是obj
范围的父级,因此,function()
也可以从{{1}}访问。
无论哪种方式,这都是JavaScript的工作原理:闭包可以访问闭包定义点可访问的所有内容。
答案 2 :(得分:1)
闭包可以访问所有更高的范围,而不仅仅是“父范围”。
答案 3 :(得分:0)
由于当前作用域中未定义obj
变量,因此JavaScript会在函数可以访问的所有作用域中上升,直到找到它为止。
就像有人抬头看着一个非常奇怪的梯子;一个可以分裂成子梯子,但是当你爬下这些子梯子时,你仍然在更大的梯子里。
答案 4 :(得分:0)
闭包在创建时可以通过设计访问周围范围,因为它是在范围内创建的。
您在外部作用域中访问的任何变量都是通过引用访问的,该引用将在创建它的作用域被销毁后保持该变量处于活动状态。
当闭包执行时,它所引用的变量仍然存在,只有在关闭后才会释放变量。
答案 5 :(得分:0)
每个Function对象都有一个Activation对象,表示它的执行上下文
在一组嵌套函数中,范围链从最内部的Activation对象开始,以Global对象(Global Scope)结束。
因此,除非变量之间存在名称冲突,否则除了全局变量之外,每个函数都可以访问其所有父函数的局部变量和参数。
Here是一个冗长但非常有用的解释。