从外部访问在闭包内定义的var(即定义闭包的范围)

时间:2015-08-03 04:36:44

标签: javascript scope

对于背景,我目前正在玩Untrusted,这是一个基于JavaScript的编程游戏,其核心机制正在编辑代码以修改游戏世界以向前发展。我通过使用记录的游戏内API修改我在本地范围内给出的变量,已经解决了大多数级别的“预期”方式。但是,我想知道是否还有一些“无意识的”方法可以通过钓鱼来修改游戏状态/游戏定义。

很多游戏的代码如下(在window范围内评估):

function foo() {
    var bar = 1234;
}

我了解我可以通过引用foo从任何范围访问window.foo。有没有办法可以在bar内访问foo,即使它没有明确公开?

为了澄清,上面的代码已经为我评估了(在window范围内,我相信,所以我至少可以获得对foo的引用)。我无法改变评估的内容。 (我想如果我真的想要的话,我可以重新定义foo,这会绕过很多限制,但这与当前的提问方向相关。)相反,我的目标是,鉴于已经评估过,修改它就位(例如为bar设置一个新值。)

提前致谢!

2 个答案:

答案 0 :(得分:4)

简短的回答是

无法在其范围/闭包之外访问局部变量(请注意,由于闭包,可能有多个范围可以访问单个局部变量)。

对于较长的答案,请参阅此答案,了解范围的工作原理:javascript can't access private properties

答案 1 :(得分:0)

如果不修改foo,则无法从bar外部访问foo

但是,修改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 );