我目前正在开发一个项目,该项目允许您在一个textarea中输入Javascript并运行它。有很多后台代码监视页面并向服务器发送数据。所有这些都在一个私人的功能,以便不能简单地使用控制台。那么唯一的问题是在textarea中输入的代码在包含服务器功能的私有函数内部被评估,从而使它能够访问站点的内部。我如何隔离它并使其成为私人功能之外的范围?一个例子如下:Javascript高级关闭
<script>
var x = 2;
(function(){
var x = 10;
var elem = document.createElement('button');
elem.addEventListener('click',function(){
alert(x);
});
document.body.appendChild(elem);
})();
</script>
在这个例子中,我希望x返回2而不是10当按钮被按下。从而迫使它运行,就好像它在全球范围内一样。
编辑
我已经试过功能结合其似乎在下降正道的窗口,但没有我一直在寻找的效果。
<script>
var x = 2;
(function(){
var x = 10;
var elem = document.createElement('button');
elem.addEventListener('click',(function(){
alert(x);
}).bind(window));
document.body.appendChild(elem);
})();
</script>
我也尝试应用窗口的功能,但唉,也没有工作。
“所有这些都在一个私人函数中,以至于无法简单地使用控制台。”对,就好像人们不能用您在脚本中提供的数据来伪造XHR请求。安全性和验证与前端无关,您必须在后端进行验证。 –
嗯,但它迫使人们实际阅读和理解脚本,而不是在控制台中弄乱变量,这会有点困难,因为我使用的是彗星频道,并且频道创建并限制为私人功能。复制频道我认为是不允许的,一旦它在页面中创建一次。因此使得仅仅通过控制台使用通道变得更加困难。 –
您不能访问在闭包之外声明的第一个'x',因为它被闭包中声明的'x'遮蔽。如果你从第三行删除了关键字'var',你就可以访问这个外部变量,但是你会在同一行覆盖它的值(现在只是'x = 10'),这不是你想要什么。这是通常与使用全局变量相关的许多问题之一。 – leftclickben