2011-05-03 216 views
3

我讀過關於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; 
        })(); 
       }      
      }); 
} 

回答

3

在JS中,範圍受函數限制。

變量作用域所在的函數內部的所有內容都可以訪問該變量 - 包括其他函數 - 除非在較窄範圍內存在另一個同名變量。

也就是說,在這個例子中,沒有var關鍵字本地化obj的範圍,無論如何,所以它是一個全球性的。 編輯問題後刪除

+0

抱歉誤導,但在** obj **變量之前有** var **關鍵字 – theateist 2011-05-03 12:41:58

1

一種方式來看待它是關閉訪問所有範圍高於自己。

另一種方式是說,實際上obj功能function(evt),這是父母的function()範圍範圍訪問,因此,obj也從function()訪問。

無論哪種方式,這都是JavaScript的工作方式:閉包有權訪問閉包定義點處的所有內容。

1

一個關閉有權訪問所有更高的範圍,不僅是「父範圍」。

0

由於obj變量未在當前作用域中定義,所以JavaScript會遍歷函數有權訪問的所有作用域,直到找到它。

這就像有人仰望一個非常奇怪的階梯;一個可以分裂成分梯子,但是當你爬下這些分梯子時,你仍然處在更大的階梯中。

0

閉包在設計時可以訪問周圍範圍,因爲它是在範圍內創建的。

您在外部作用域中訪問的任何變量都可以通過一個引用來訪問,該引用會在創建該作用域的作用域被銷燬後保持該變量有效。

這種方式當閉包執行時,它所引用的變量仍然存在,只有在閉包被處置後纔會釋放變量。

0

每個Function對象都有一個表示它的執行上下文的Activation對象。
在一組嵌套函數中,作用域鏈從最內層的Activation對象開始到Global對象(Global Scope)結束。
因此,除非變量之間存在名稱衝突,否則除全局變量外,每個函數都可以訪問它的所有父函數的局部變量和參數。
Here是一個漫長但非常有用的解釋。

相關問題