Javascript 是否可以访问函数的关闭?

Javascript 是否可以访问函数的关闭?,javascript,scope,closures,Javascript,Scope,Closures,javascript中的函数通过保留一个(隐藏)到其封闭范围的链接来形成闭包 当我们拥有函数(作为变量值)时,是否可以通过编程方式访问它 真正的目标是理论上的,但是一个演示可以是列出闭包的属性 var x = (function(){ var y = 5; return function() { alert(y); }; })(); //access y here with x somehow 这就是关闭的目的之一——保持信息的私密性。由于函数已经被执行,其作

javascript中的函数通过保留一个(隐藏)到其封闭范围的链接来形成闭包

当我们拥有函数(作为变量值)时,是否可以通过编程方式访问它

真正的目标是理论上的,但是一个演示可以是列出闭包的属性

var x = (function(){
   var y = 5;
   return function() {
       alert(y);
   };
})();

//access y here with x somehow
这就是关闭的目的之一——保持信息的私密性。由于函数已经被执行,其作用域变量不再从外部可用(而且从来没有),只有在其作用域中执行的函数(仍然)才具有访问权限

但是,您可以通过getter/setter提供访问权限

您可能想了解一下闭包。道格拉斯·克罗克福德的解释也是非常值得推荐的。你可以用闭包做很多有趣的事情;)

编辑:
您有几个选项可以检查闭包:在webdeveloper控制台中观察对象,或者(我经常这样做)返回一个调试函数,将所有私有变量转储到控制台。

否,除非您公开它:

var x = function(){
        var y = 5;

        return {             
           getY: function(){
              return y;
          },
          setY: function(newY){
             y = newY;
          }    
       }
   }


    x.setY(4);

您可以编辑警报功能:

var x = (function(){
   var y = 5;
   return function() {
       alert(y);
   };
})();

var oldAlert = alert;

alert = function (x) {
    oldAlert(x);
    window.y = x;
}

x();

console.log(y); // 5

或者,如果您拥有代码,您可以使用standart Getter和Setter。

如果您在前端环境中,并且如果您可以在先前的脚本标记中执行自己的Javascript,那么一个选项是附加一个MutationObserver,等待要监视的脚本标记插入到文档中,然后在插入时,更改其代码,以便暴露您要检查或更改的功能。下面是一个例子:


新突变观察者((突变,观察者)=>{
//查找要篡改的脚本标记是否存在
//如果你无法预知它的位置,
//您可能需要遍历突变的附加节点
常量tamperTarget=document.querySelector('script+script');
如果(!目标){
返回;
}
observer.disconnect();
log('目标脚本被篡改');
tamperTarget.textContent=tamperTarget.textContent.replace(
“返回函数”,
'window.y=y;返回函数'
);
设置超时(()=>{
log(“侵入篡改目标的脚本并发现了y的”,y);
log('还可以用另一个值替换本地y');
});
})
.observe(document.body,{childList:true});
log(“正在运行的篡改目标脚本”);
var x=(函数(){
变量y=5;
返回函数(){
警报(y);
};
})();

code示例可以更好地解释您的确切要求problem@Blaster:试试看。这行不通
y
不是
x
@Blaster上的属性,因为“x”函数就是这样做的。您的示例也会在控制台上记录5。@Blaster:这是显示给您的
5
警报(y)
console.log()
显示
TypeError:无法读取未定义的属性“y”
好的,谢谢大家现在有意义了:)嘿,+1用于跳出框框思考。我认为OP希望能够检查闭包中的所有变量。我只想强调一点,闭包并不完全是黑盒子。有趣的是,你能详细说明一下“脚本+脚本”部分吗?我注意到没有它它就无法工作,我只是不知道它做了什么。这只是一个例子,可以将内置页面脚本标记与扩展/userscript/etc注入页面的脚本区分开来。实际上,上面的脚本标签可能不存在,因为浏览器中的其他东西将“运行”该代码。哦,有趣的是,“+脚本”只是跳过了第一个,对吧,没有意识到。。mutationobserver是否迭代正在加载的所有脚本?在生产环境中,是应该使用document.querySelectorAll,还是不必使用它?哦,你是说选择器,这就是注入的上层脚本识别下层脚本是否存在的方式
script+script
是一个CSS选择器,它将匹配一个紧跟另一个
标记的
标记。mutationobserver是否迭代正在加载的所有脚本?一次只能创建一个脚本。在加载脚本之后,在将其放入DOM之后,在脚本执行之前,观察者将立即运行其回调。您可以使用任何方法来标识所需的元素。我喜欢
querySelectorAll
,但是任何能够实现您所寻找的逻辑的东西都会起作用