从外部(即定义闭包的作用域)访问闭包内部定义的var

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

本文关键字:闭包 定义 访问 内部 var 作用域 从外部      更新时间:2023-09-26

我目前正在玩《Untrusted》,这是一款基于javascript的编程游戏,其核心机制是通过编辑代码来修改游戏世界。我已经以"预期"的方式解决了大多数关卡,即通过使用记录的游戏内API修改我在局部范围内给出的变量。然而,我想知道是否也有一些"意想不到的"方法来修改游戏状态/游戏定义。

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

function foo() {
    var bar = 1234;
}

我理解我可以通过引用window.foo从任何范围访问foo。是否有一种方法,我可以访问foo内部的bar,即使它没有明确暴露?

澄清一下,上面的代码已经为我评估过了(在window范围内,我相信,所以我至少可以得到对foo的引用)。我不能改变被评估的东西。(我想如果我真的想,我可以重新定义foo,这将绕过很多限制,但这与当前的问题方向无关。)更确切地说,我的目标是,在已经计算过的情况下,就地修改它(比如为bar设置一个新值)。

提前感谢!

简短的回答是no

不可能在局部变量的作用域/闭包之外访问它(注意,由于闭包的关系,可能有多个作用域可以访问单个局部变量)。


>>>>>>>>>>>>>>>>>>>

>>>>>>>>>> >>>> >

如果不修改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 );