2012-04-22 38 views
0

可以說我有一個全球性的功能:如何從瀏覽器控制檯訪問存儲在函數閉包中的JavaScript變量?

function Init() 
{ 
     var v = 10; 
     window.GlobalFunction = function() 
     { 
      // Global Function has access to v, because of closure 
      alert(v); 
     } 
} 

Init(); 

如何我可以從Firebug的控制檯獲取訴價值?我可以在那裏放置斷點並看到價值。然而這對我來說還不夠。我想爲第三方網站構建FireFox插件,所以我需要訪問這個變量,但不能更改源代碼。

+1

在你的例子中'v'沒有被閉包捕獲,而是引入了一個全局變量。你的意思是把它封在封口裏嗎? – chuckj 2012-04-22 20:58:35

+0

控制檯也可以訪問全局變量;只需在控制檯輸入'v'並點擊運行:) – 2012-04-22 20:58:48

+0

誰說v是全球性的?你爲什麼認爲這個片段在全球範圍內?對於沒有想象力的人,我更新了原始代碼示例:-)。 – Viktar 2012-04-23 01:42:42

回答

2

如果v像你說的那樣是一個全局變量,那麼你應該能夠在控制檯輸入v來獲得它的值。

如果v不是全局的,那麼您只能從包含它的函數中訪問它。 JavaScript是一種功能範圍的語言,關鍵字var指示變量只能在當前範圍內訪問。如果你不想使用斷點/調試器,如果你不能修改源代碼,並且源代碼中沒有變量的getter方法,那麼你可能倒黴。

試圖在這裏獲得創意,您可以基於Init的原型或任何包含它的對象(例如,使用關鍵字new)創建一個對象,併爲您的對象版本添加getter函數。然後使用您的新對象,無論您以前使用原始代碼的對象。

+0

v不是全球性的。我說功能是全球性的。看到我更新的代碼示例。 – Viktar 2012-04-23 01:47:50

+0

答覆已更新。 – Trott 2012-04-23 03:23:07

0

如果你的意思是你如何從捕獲它的函數之外訪問由閉包捕獲的變量,那麼你不能。控制檯沒有給你任何特殊的狀態訪問權限,它執行JavaScript,就好像你在當前的斷點處執行eval()(或者如果你不在斷點處,則是全局的)。如果您無法從JavaScript訪問變量,則無法從控制檯訪問它。

正如您所指出的,您只能在範圍內訪問v,也就是說,當您停在斷點處並且v位於範圍內時。

相關問題