从外部(即定义闭包的作用域)访问闭包内部定义的var
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
设置一个新值)。
提前感谢!
简短的回答是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 );
相关文章:
- 为Google闭包类定义属性的首选方式是什么
- 这是一种捕获闭包定义堆栈的方法吗
- 在 For 循环中的闭包中未定义
- 高级闭包兼容性和静态类型 - 使用未定义类型和全局函数,如localStorage.getItem();
- 闭包编译器 - 保留未使用的函数,不要重命名未定义的函数
- 仅在闭包中定义的模拟/存根对象
- 在其他地方定义的 JavaScript 闭包
- 如何在PrimeFaces中的命令按钮上定义带有闭包的oncomplete事件
- Javascript 闭包(使用参数名称在同一函数中定义对象)
- Google闭包在高级模式下调用未定义的函数
- 使用闭包编译器键入indexOf重新定义
- C#Asp.net自定义控件的Javascript闭包
- 使用闭包创建的私有函数如何访问构造函数中定义的变量
- 为什么我必须在闭包中声明一个函数来访问闭包中定义的变量
- 无法创建闭包中定义的函数的对象
- 获得'未定义'使用闭包工具继承时出现属性错误
- 传递给闭包的角度参数未定义
- 如何检查闭包是否在JavaScript中定义
- 我如何把所有这1200+行自定义javascript到一个闭包,所以没有全局变量
- Google JavaScript 闭包:定义传递给许多函数的结构