javascript - 如何避免在此示例中使用 `eval()`?

标签 javascript eval

我正在尝试使用字符串作为对变量的引用以传递到函数中。例如:

var names = ['Peter', 'John'],

var hasName = function(name){
    var params = ['names'];
    return $.inArray(name, eval( params[0] )) === -1;
};

如何避免eval()

编辑:

来自params[0]的字符串来 self 的html中inputdata-qval。包含实际数据的数组可以在任何地方声明,params[0] 只是对 data-qval 中作为字符串传入的数组的引用,它是一个参数。我在这里粘贴了我的插件代码。

http://pastebin.mozilla.org/1598528101行

完整示例:http://jsfiddle.net/elclanrs/ZsS2D/29/

它目前有效,我只是在寻找一种摆脱 eval()...

最佳答案

在这种特殊情况下,只需使用名称:

var names = ['Peter', 'John'],
var hasName = function(name){
    var params = ['names'];
    return $.inArray(name, names ) === -1;
};

(另请参阅下面的注释。) (您的编辑使上述内容不适用。)

如果您尝试使用字符串“names”在某个容器中查找 names 数组,则必须拥有对该容器的引用,例如:

var obj = {
    names: ['Peter', 'John'
};
var hasName = function(name){
    var params = ['names'];
    return $.inArray(name, obj[params[0]] ) === -1;
};

如果除了您执行此操作的变量范围之外没有任何容器,则必须使用 eval。但你可以(通常应该)调整一些东西,这样你就有一个容器(如上所述),这样你就可以避免它。请注意,如果 names 在全局范围内声明,则您确实有一个容器 (window)。

总结一下:

  1. 如果 names 是全局范围内的 var (或 implicit global ),则 window[params[0]]将为您提供引用。

  2. 如果names已存在于某个容器对象中,您可以使用container[params[0]]来获取对其的引用。

  3. 如果 names 是函数内的 var,则无法使用没有 eval 的运行时字符串来获取它;理想情况下,不要使用 var names = [...];,而是使用 var container = {names: [...]};,然后您可以使用 容器[params[0]]

<小时/>

请注意,您的函数名为 hasName,但当数组具有名称时,它返回 true,而 false 当它发生时。您可能需要 !== -1,而不是 === -1

关于javascript - 如何避免在此示例中使用 `eval()`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10329039/

相关文章:

javascript - 如何在屏幕的特定位置创建一个 div?

JavaScript:在鼠标指针下突出显示/选择单词

python - 使用 Python 中的 eval 函数来翻译字符串

Javascript 冰雹序列

javascript - 使用 javascript 和一些跨浏览器支持将内容添加到 svg

julia - 生成表达式,然后在 Julia 中检查它们

c# - 以字符串形式访问对象属性并设置其值

Javascript json eval() 注入(inject)

java - 在 Java 中评估 boolean 值

javascript - 如何在点击时将div另存为图像?