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

pat*_*urs 2 javascript string eval window function

可能重复:
为什么使用JavaScript eval函数是一个坏主意?

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

我目前的代码:

funcOne(target).funcTwo(x, y, z);
Run Code Online (Sandbox Code Playgroud)

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

eval('funcOne(target).funcTwo(x, y, z)');
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

650*_*502 6

在Javascript中,语法a.b可以替换为a["b"].所以在你的情况下你可以使用

window["funcOne"](target)["funcTwo"](x, y, z);
Run Code Online (Sandbox Code Playgroud)

当然,只有当你使用变量而不是"funcOne"和时才有意义"funcTwo".

如果所有内容都已修复,但您只是想延迟执行,则可以使用带有匿名闭包的"thunking"

x = function(){ return funcOne(target).funcTwo(x, y, z); };
Run Code Online (Sandbox Code Playgroud)

然后你可以评估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);
}
Run Code Online (Sandbox Code Playgroud)

在这里,我onclick在div上使用了一个闭包,但这不会起作用,因为所有这些函数都将使用相同的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);
}
Run Code Online (Sandbox Code Playgroud)

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

当你需要创建许多独立的闭包时,通常在Javascript中使用这种创建函数来立即调用它的模式,因此最好知道并理解它.