javascript字符串作为命令行,为什么不eval()?

时间:2012-10-21 08:21:44

标签: javascript string function window eval

  

可能重复:
  Why is using the JavaScript eval function a bad idea?

所以我通过许多不同的方法阅读了使用window[]();eval();从字符串调用函数的方法。我想知道我的情况(即下面)是什么方法才是正确的方法,如果是的话,解释原因。还解释了为什么eval();不是一个很好的选择,很多人都说安全性,但如果你能获得任何能够让你更改该页面上的脚本的浏览器插件,为什么安全性会成为一个问题呢? (例如:firefox的firebug)

我目前的代码:

funcOne(target).funcTwo(x, y, z);

如何使用推荐的window[]();方式调用此方法?为什么我不能用它?:

eval('funcOne(target).funcTwo(x, y, z)');

我不希望你多次问这个问题的烦恼,因为我现在想不出一种方法来调用一个叫做双重函数的方法。

提前致谢!

1 个答案:

答案 0 :(得分:6)

在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()进行评估,以便稍后获得所需的结果。

即使变量targetxyz对于封闭范围是本地的,最后一个示例也能正常工作,因为thunking闭包将“捕获”它们。

但是你应该注意这样一个事实,即在Javascript中创建一个新范围的唯一方法是使用一个函数(一个用{包围的块而}不是像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);
}

这里我在div上使用了onclick事件的闭包,但这不起作用,因为所有这些函数都将使用相同的i变量。因为在Javascript中创建范围的唯一方法是使用函数,解决方案是:

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);
}

这样,i处理程序中的变量onclick对于每个闭包都是不同的。

当你需要创建许多独立的闭包时,这种创建函数只是为了立即调用它的模式经常在Javascript中使用,所以最好知道并理解它。