Javascript 破坏立即执行的匿名函数的封装?
一种常见的Javascript模式是:Javascript 破坏立即执行的匿名函数的封装?,javascript,Javascript,一种常见的Javascript模式是: (function() { var localScopedValue = "foobar"; // code... functions... }()); 自动执行或立即执行的匿名函数为其内部的所有内容创建一个作用域,以防止全局作用域受到污染,从理论上讲,它还可以防止任何人从外部脚本、浏览器控制台等获取对函数对象或其内部定义的任何内容的引用 然而,Javascript是一种具有反射等特性的动态语言,我想知道是否有任何方法——无论多么粗糙(但不编辑
(function() {
var localScopedValue = "foobar";
// code... functions...
}());
自动执行或立即执行的匿名函数为其内部的所有内容创建一个作用域,以防止全局作用域受到污染,从理论上讲,它还可以防止任何人从外部脚本、浏览器控制台等获取对函数对象或其内部定义的任何内容的引用
然而,Javascript是一种具有反射等特性的动态语言,我想知道是否有任何方法——无论多么粗糙(但不编辑任何现有代码)——获取对本地语言的引用,而这些本地语言不是故意从Javascript代码中公开的
原因:纯粹的好奇心/破坏性的东西
添加:我正在研究的东西包括函数、调用者和事件监听器,基本上是生命中已知的可以调用/挂接的项目,但我无法组合完整的包。JS没有“真实的”反射-它所拥有的只是使用变量作为键访问对象属性的能力,该键使用myObject[myVar]
语法,而不是myObject.myProperty
因此,这不提供对词典范围的私有变量的访问。由于您没有使用var
关键字,您刚刚创建了一个全局变量,可以在IIFE之外访问它?忘记var是一个错误。如果IILife的私有变量不是从纯JavaScript中意外暴露出来的,那么就无法访问它们。您可以随时查看调用堆栈,了解上面发生的事情(function(){console.log(arguments.callee.caller)})(
通常,您会创建一个全局对象(比如jquery),并且您想要公开的所有内容都会在该对象上公开。其他所有内容都存储在创建该对象的即时函数的闭包中。如果您真的想发疯,可以遍历堆栈并toString
函数。这不会让你了解当地人,但至少会让你知道他们的名字。不知道如何从中获取值。@Alxandr AFAIK只有当您已经在堆栈跟踪中时,才可以这样做,这也意味着变量在范围内(尽管不是“自动发现”)是的。因此,您必须使用基于回调的东西,在这里您向它传递一个邪恶的“inspect”函数。另一方面很多东西都有回调。。。也可以在创建IIFE之前将某些全局函数替换为存储“作用域”并返回原始值的“代理”函数。@Alxandr我认为这不起作用-作为回调提供的函数无法访问局部变量,因为它们是词汇作用域。是的,但如前所述,他们可以接触到打电话的人。