javascript字符串作为命令行,为什么不eval()?
可能重复:javascript字符串作为命令行,为什么不eval()?,javascript,string,function,window,eval,Javascript,String,Function,Window,Eval,可能重复: 因此,我已经阅读了许多关于使用window[]()从字符串调用函数的不同方法以及eval()。我想知道对于我的情况(如下所示),什么方法才是正确的方法,如果是,请解释原因。还要解释为什么eval()并不是一个很好的选择,很多人都说是安全性的,但是如果你可以获得任何浏览器插件,使你能够更改该页面上的脚本,那么为什么安全性会成为一个问题呢?(示例:firefox的firebug) 我当前的代码: funcOne(target).funcTwo(x, y, z); 如何使用推荐的窗口[
因此,我已经阅读了许多关于使用
window[]()从字符串调用函数的不同方法代码>以及eval()代码>。我想知道对于我的情况(如下所示),什么方法才是正确的方法,如果是,请解释原因。还要解释为什么eval()
并不是一个很好的选择,很多人都说是安全性的,但是如果你可以获得任何浏览器插件,使你能够更改该页面上的脚本,那么为什么安全性会成为一个问题呢?(示例:firefox的firebug)
我当前的代码:
funcOne(target).funcTwo(x, y, z);
如何使用推荐的窗口[]()调用此功能代码>方式?为什么我不能用这个
eval('funcOne(target).funcTwo(x, y, z)');
我不希望你对这个问题的烦恼被问了很多次,因为我现在想不出一种方法来调用双函数
提前谢谢 在Javascript中,语法a.b
可以替换为a[“b”]
。因此,在您的情况下,您可以使用
window["funcOne"](target)["funcTwo"](x, y, z);
当然,只有在使用变量而不是“funcOne”
和“funcTwo”
时才有意义
如果一切都已修复,但您只是想延迟执行,那么您可以使用“thunking”和匿名闭包
x = function(){ return funcOne(target).funcTwo(x, y, z); };
然后您可以使用x()
进行计算,以便稍后获得所需的结果
即使变量target
和x
、y
和z
是封闭范围的局部变量,上一个示例也能正常工作,因为thunking闭包将“捕获”它们
您应该注意的事实是,在JavaScript中,创建一个新的范围的唯一方法是使用一个函数(一个包围着 { < /C> >和<代码> } /代码>的不是C++和其他语言中出现的范围。
如果您需要在一个循环中创建几个闭包,这可能会产生反作用,并且是一个非常常见的错误源
for (var i=0; i<options.length; i++)
{
var menu_item = document.createElement("div");
menu_item.textContent = "Option " + i;
menu_item.onclick = function () {
// Warning this will NOT work. All divs will
// alert using the same number!
alert("Option " + i + " selected");
}
menu.appendChild(menu_item);
}
这样,onclick
处理程序中的变量i
对于每个闭包都是不同的
当您需要创建许多独立的闭包时,Javascript中通常会使用这种创建函数以立即调用函数的模式,以便更好地了解和理解它。当所有变量、目标、x、,y和z是有作用域的,我需要随时调用它,而不是在同一个作用域内?@pathurs:这会起作用,因为thunk会“捕获”局部变量。但是,如果您需要创建许多thunk,那么重要的是要理解捕获的是变量而不是变量的值,错误通常是无意中创建了许多共享相同变量的闭包。请参阅扩展解释…已接受和+1,因为答案的细节和多个示例提供了最佳答案那么您正在尝试构建类似Firebug的命令行?请提供更多的信息eval
可能是正确的选择,这取决于您想要实现的目标。我不认为您会对这个问题感到困惑,以为我想创建一个类似firebug的命令行,但我的意思是我想调用一个函数,该函数是由运行前未知的信息生成的,所以我保存它并执行它,但是如何?
for (var i=0; i<options.length; i++)
{
var menu_item = document.createElement("div");
menu_item.textContent = "Option " + i;
(function(i){
menu_item.onclick = function () {
alert("Option " + i + " selected");
};
})(i); // Pass current `i` as parameter
menu.appendChild(menu_item);
}