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

时间:2011-05-03 12:25:21

标签: javascript jquery closures

我读到了关于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;
                    })();
                }                    
            });
}

6 个答案:

答案 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是一个冗长但非常有用的解释。