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

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

问题描述:

我读过关于JavaScript关闭的内容,我以为我明白了,但显然我没有。为什么ajax调用中的闭包可以访问外部范围?

成功功能在请求成功时被调用。这意味着,当封闭(function() { return obj; })();执行范围内成功功能,是function (evt) {...}了,所以它是如何仍然可以访问OBJ

如何在这个例子中,堵口

EDITED(有OBJVAR

function (evt) { 
      var obj = evt.data.obj, 
      $.ajax({ 
       type: "POST", 
       url: url, 
       data: data, 
       success: function() { 
        var o = (function() { 
         return obj; 
        })(); 
       }      
      }); 
} 

在JS中,范围受函数限制。

变量作用域所在的函数内部的所有内容都可以访问该变量 - 包括其他函数 - 除非在较窄范围内存在另一个同名变量。

也就是说,在这个例子中,没有var关键字本地化obj的范围,无论如何,所以它是一个全球性的。 编辑问题后删除

+0

抱歉误导,但在** obj **变量之前有** var **关键字 – theateist 2011-05-03 12:41:58

一种方式来看待它是关闭访问所有范围高于自己。

另一种方式是说,实际上obj功能function(evt),这是父母的function()范围范围访问,因此,obj也从function()访问。

无论哪种方式,这都是JavaScript的工作方式:闭包有权访问闭包定义点处的所有内容。

一个关闭有权访问所有更高的范围,不仅是“父范围”。

由于obj变量未在当前作用域中定义,所以JavaScript会遍历函数有权访问的所有作用域,直到找到它。

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

闭包在设计时可以访问周围范围,因为它是在范围内创建的。

您在外部作用域中访问的任何变量都可以通过一个引用来访问,该引用会在创建该作用域的作用域被销毁后保持该变量有效。

这种方式当闭包执行时,它所引用的变量仍然存在,只有在闭包被处置后才会释放变量。

每个Function对象都有一个表示它的执行上下文的Activation对象。
在一组嵌套函数中,作用域链从最内层的Activation对象开始到Global对象(Global Scope)结束。
因此,除非变量之间存在名称冲突,否则除全局变量外,每个函数都可以访问它的所有父函数的局部变量和参数。
Here是一个漫长但非常有用的解释。