【问题标题】:javascript string as command line, why not eval()? [duplicate]javascript 字符串作为命令行,为什么不使用 eval()? [复制]
【发布时间】:2012-10-11 08:40:14
【问题描述】:

可能重复:
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)');

我不希望你对这个问题被问多次感到烦恼,因为我目前想不出一种方法来调用一个,作为一个调用它,双重函数。

提前致谢!

【问题讨论】:

  • 所以你正在尝试构建一个类似 Firebug 的命令行?请提供更多信息。 eval 可能是正确的选择,具体取决于您想要实现的目标。
  • 我不明白你怎么会对这个问题感到困惑,以至于我想制作一个类似萤火虫的命令行,但我的意思是我想调用一个函数从运行前未知的信息生成,所以我保存并执行它,但是如何?

标签: javascript string function window eval


【解决方案1】:

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

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

这种创建函数只是为了立即调用它的模式通常在 Javascript 中使用,当您需要创建许多独立的闭包时,最好了解和理解它。

【讨论】:

  • 当所有变量、目标、x、y 和 z 都在范围内并且我需要在不在同一范围内的情况下随时调用它时,我将如何使用 x() 执行第二个示例?
  • @pathurs:它会起作用,因为 thunk 将“捕获”局部变量。但是,如果您需要创建许多 thunk,重要的是要了解捕获的是 变量 而不是 变量的值,并且通常错误是无意中创建了许多闭包共享相同的变量。请参阅扩展说明...
  • 接受并+1,因为答案的细节和多个示例给出了最佳答案
猜你喜欢
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 2011-04-08
  • 2016-12-30
  • 1970-01-01
相关资源
最近更新 更多