![](/img/trans.png)
[英]Javascript: Run a function defined outside this closure as if it were defined inside this closure
[英]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.