打破立即执行的匿名函数的封装?

3
一种常见的JavaScript模式是:
(function() {
  var localScopedValue = "foobar";
  // code... functions...
}());

自执行或即时执行的匿名函数创建了一个作用域,防止全局作用域的污染,理论上还可以防止任何人从外部脚本、浏览器控制台等获取对函数对象或内部定义内容的引用。这就是想法。
然而,由于JavaScript是一种具有反射等特性的动态语言,我想知道是否有任何方法——无论多么巧妙(但不编辑任何现有代码)——可以从JavaScript代码中获取未被故意公开的本地变量的引用。
原因:纯好奇心/破坏事物。
补充说明:我正在研究的东西包括Function.caller和事件侦听器,基本上是IIFE内部已知调用/挂钩的任何项目,但我无法组合完整的包。

6
由于您没有使用 var 关键字,您刚刚创建了一个全局变量,并且它可以在 IIFE 外部被访问到。 - adeneo
忘记了 var 是一个错误。 - Jason S
不,如果私有变量没有意外从纯JavaScript中暴露出来,就无法访问IIFE的私有变量。 - Aadit M Shah
你总是可以沿着调用栈向上了解正在发生的事情... (function() { console.log(arguments.callee.caller) })() - Catalyst
通常情况下,你会创建一个单一的全局对象(例如像jQuery那样),并将所有你想要公开的内容都公开在该对象上。其他所有内容都存储在创建该对象的立即函数的闭包中。 - Mike Cheel
你的沙盒是否受到攻击?为什么这很重要? - Shanimal
1个回答

1

JS没有"真正的"反射 - 它只能使用变量作为键,使用myObject[myVar]语法而不是myObject.myProperty来访问对象的属性。

因此,这无法访问词法范围内私有变量。


如果你想疯狂一点,可以遍历堆栈并 toString 函数。这样做不能获得局部变量的值,但至少能给出它们的名称。不知道该如何获取其中的值。 - Alxandr
据我所知,只有在堆栈跟踪中时才能这样做,这也意味着变量在作用域内(尽管不是“自动可发现的”)。 - Alnitak
是的。因此,您必须使用基于回调的某些东西,其中传递了一个邪恶的“inspect”函数。另一方面,许多东西都有回调...在创建IIFE之前,通过替换某些全局函数为存储“作用域”的“代理”函数并返回原始值也可以实现。 - Alxandr
@Alxandr 我认为那不会起作用 - 作为回调函数提供的函数无法访问本地变量,因为它们是_Lexically_作用域。 - Alnitak
是的,但正如所说,它们可以访问调用者。 - Alxandr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接