我读过关于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;
})();
}
});
}
在JS中,作用域受函数限制。
变量作用域的函数中的所有内容都可以访问该变量(包括其他函数(,除非在较窄的范围内存在另一个同名变量。
编辑问题后删除也就是说,在此示例中,无论如何都没有var
关键字来本地化obj
的范围,因此它是一个全局关键字。
它的一种方法是闭包可以访问自身之上的所有作用域。
另一种方式是说obj
实际上是在函数function(evt)
的范围内可访问的,这是function()
范围的父级,因此,obj
也可以从function()
访问。
无论哪种方式,这就是 JavaScript 的工作方式:闭包可以访问闭包定义点可以访问的所有内容。
包可以访问所有更高的作用域,而不仅仅是"父作用域"。
由于 obj
变量未在当前作用域中定义,因此 JavaScript 会上升函数可以访问的所有作用域,直到找到它为止。
这就像有人在看一个非常奇怪的梯子;一个可以分裂成子梯子的梯子,但是当你爬下这些子梯子时,你仍然在更大的梯子上。
闭包在创建时设计上可以访问周围的范围,因为它是在作用域中创建的。
在外部作用域中访问的任何变量都是通过引用访问的,该引用将在销毁创建变量的作用域后使变量保持活动状态。
这样,当闭包执行时,它引用的变量将仍然存在,只有在关闭闭包后才会释放变量。
每个函数对象都有一个表示其执行上下文的激活对象。
在一组嵌套函数中,从最内部的激活对象开始,到全局对象(全局范围(结束,形成作用域链。
因此,除非变量之间存在名称冲突,否则除了全局变量之外,每个函数都可以访问其所有父函数的局部变量和参数。
这是一个冗长但非常有用的解释。