繁体   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