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