JavaScript 这里可以用eval吗

JavaScript is it okay to use eval here

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

我想根据变量名调用函数

即进行国际象棋比赛并检查棋子的动作。

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

如果值为 "queen" 则调用 queen()

可以用吗

eval(piece+"()");

在不为这种事情编写 switch 语句或 if 链的情况下,是否有任何替代方案。

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

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() 的代码,例如上面的解决方法。