JavaScript可以在这里使用eval

时间:2015-04-04 05:32:21

标签: javascript switch-statement eval

function ...(...){
     function queen(){...}
     function rook(){...}
}

我想调用一个基于变量名的函数

即。用于国际象棋比赛和检查棋子的动作。

if (piece === "rook") rook();

如果值为“queen”,则调用queen()

可以使用

eval(piece+"()");

如果没有为此类事情编写switch语句或if链,是否有其他替代方法。

1 个答案:

答案 0 :(得分:3)

在没有eval()的情况下解决这个问题的常见解决方法是将函数作为属性放在对象上,然后使用对象/属性命名法来执行所需的函数。

var pieceOperations = {
    queen: function() {...},
    rook: function() {...}
};

var piece = "rook";
pieceOperations[piece]();    // executes pieceOperations.rook()

Javascript没有提供一种方法来解决原始问题,即通过变量中的字符串执行本地函数而不使用eval(),因为它不会公开可以引用属性的本地范围对象(尽管如此)对象存在于内部,它保持内部)。因此,如果要按名称访问,只需将资源作为属性放在对象而不是局部变量上,然后您可以通过obj[prop]语法访问它。


至于使用eval(),如果您100%确定知道piece变量的来源,因此您知道在那里永远不会得到一些意料之外的代码,那么使用它是安全的eval()。使用eval()的安全性完全取决于您传递给eval()的字符串的来源。也就是说,我更愿意完全避免eval(),因此我不必怀疑安全问题或性能问题(eval()可能会慢得多)。我总是找到另一种方法来编写不需要eval()的代码,例如上述解决方法。