为什么 ajax 调用中的闭包可以访问外部作用域



我读过关于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 会上升函数可以访问的所有作用域,直到找到它为止。

这就像有人在看一个非常奇怪的梯子;一个可以分裂成子梯子的梯子,但是当你爬下这些子梯子时,你仍然在更大的梯子上。

闭包在创建时设计上可以访问周围的范围,因为它是在作用域中创建的。

在外部作用域中访问的任何变量都是通过引用访问的,该引用将在销毁创建变量的作用域后使变量保持活动状态。

这样,当闭包执行时,它引用的变量将仍然存在,只有在关闭闭包后才会释放变量。

每个函数对象都有一个表示其执行上下文的激活对象。
在一组嵌套函数中,从最内部的激活对象开始,到全局对象(全局范围(结束,形成作用域链。
因此,除非变量之间存在名称冲突,否则除了全局变量之外,每个函数都可以访问其所有父函数的局部变量和参数。
这是一个冗长但非常有用的解释。

最新更新