2013-02-03 62 views
1

我目前正在开发一个项目,该项目允许您在一个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> 

我也尝试应用窗口的功能,但唉,也没有工作。

+6

“所有这些都在一个私人函数中,以至于无法简单地使用控制台。”对,就好像人们不能用您在脚本中提供的数据来伪造XHR请求。安全性和验证与前端无关,您必须在后端进行验证。 –

+0

嗯,但它迫使人们实际阅读和理解脚本,而不是在控制台中弄乱变量,这会有点困难,因为我使用的是彗星频道,并且频道创建并限制为私人功能。复制频道我认为是不允许的,一旦它在页面中创建一次。因此使得仅仅通过控制台使用通道变得更加困难。 –

+1

您不能访问在闭包之外声明的第一个'x',因为它被闭包中声明的'x'遮蔽。如果你从第三行删除了关键字'var',你就可以访问这个外部变量,但是你会在同一行覆盖它的值(现在只是'x = 10'),这不是你想要什么。这是通常与使用全局变量相关的许多问题之一。 – leftclickben

回答

0

事实证明,答案比我想象的要简单得多。全局范围内但在关闭函数之外的函数可以由任何函数调用,但它只能访问全局范围中的变量。因此下面的例子完美地工作。

<script> 

var run = function(){alert(x);}; 
var x = 2; 
(function(){ 
    var x = 10; 
    var elem = document.createElement('button'); 
    elem.addEventListener('click',run); 
    document.body.appendChild(elem); 
})(); 

</script> 
0

在你编辑版本更改警报(x)的提醒( .X)。 它解决你的问题吗?

+0

这是行不通的,但是因为用户提供的不是我的代码,我不能完全要求他们输入每个变量的盈方。您看到的目的是隐藏用户提交的代码中的第二个x。 –