簡體   English   中英

從外部訪問在封閉內部定義的變量(即定義封閉的范圍)

[英]Access a var defined inside a closure from outside (i.e. the scope where the closure was defined)

對於背景游戲,我目前正在玩Untrusted ,這是一個基於JavaScript的編程游戲,其核心機制是編輯代碼以修改游戲世界,從而向前發展。 我已經通過使用文檔中的API修改了在本地范圍內給定的變量,從而以“預期”方式解決了大多數問題。 但是,我想知道是否還有一些“意外”方式可以通過釣魚來修改游戲狀態/游戲定義。

許多游戲的代碼如下(在window范圍內評估):

function foo() {
    var bar = 1234;
}

我了解可以通過引用window.foo從任何范圍訪問foo 即使沒有顯式公開,我是否可以訪問foo內部的bar

需要澄清的是,上面的代碼已經為我進行了評估(我相信在window范圍內,因此至少可以得到對foo的引用)。 我無法更改所評估的內容。 (我想我可以根據需要重新定義foo ,這將繞過很多限制,但這與當前的詢問方向有關。)相反,我的目標是,鑒於已經對此進行了評估,請對其進行適當的修改(例如為bar設置一個新值)。

提前致謝!

簡短的答案是否定的

無法在其范圍/閉包之外訪問局部變量(請注意,由於閉包,可能有多個范圍可以訪問單個局部變量)。


對於長答案,請參見此答案以了解范圍的工作原理: javascript無法訪問私有屬性

如果不修改foo ,則無法從foo外部訪問bar

但是,修改foo並不難:

 //Original code function foo ( ) { var bar = 1234; } //Modify foo: (function(){ var fooMatches = foo.toString().replace(/var\\s+bar/g, "window.bar").match(/^\\s*function\\s+foo\\s*\\(([^()]*)\\)\\s*{([^\\0]*)}\\s*$/); var args = fooMatches[1].split(/\\s*,\\s*/); args.push( fooMatches[2] ); foo = Function.apply( window, args ); })(); //Access bar foo(); alert( bar ); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM