我怎样才能避免在这个例子中使用'eval()'

How can I avoid using `eval()` in this example?

本文关键字:eval 能避免      更新时间:2023-09-26

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

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

如何避免eval()

编辑:

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

http://pastebin.mozilla.org/1598528 101线 .

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

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

在这种特殊情况下,只需使用 names

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(或隐式全局),window[params[0]]将为您提供对它的引用。

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

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


请注意,您的函数被称为 hasName ,但是当数组没有名称时,它会返回true,当数组有名称时false。你可能想要!== -1,而不是=== -1

还不够吗?

var hasName = function(name){
    return $.inArray(name, names) > -1;
};

另外,请注意比较

因为 JavaScript 将 0 视为松散地等于 false(即 0 == false,但 0 !== false),如果我们检查值是否存在 在数组中,我们需要检查它是否不等于(或大于) -1.

字符串作为对变量的引用?如果它是浏览器中的全局对象,它将位于窗口对象中,因此您只需执行window[variableName]即可获取其值。 对象也一样,即代替object.foo,您可以执行object['foo']bar = 'foo', object[bar]。 对于局部范围的变量,如果不使用对象或eval,就无法执行此操作。

如果names是全局的,则可以使用全局命名空间,即 window

var hasName = function(name,namespace){
    namespace = namespace || window;
    return $.inArray(name, namespace.names) > -1;
};
hasName('Peter'); //=> true;

这也可能是一个想法:

var MYNS = { names:['Peter','John']
            ,hasName: function(name){
               return $.inArray(name, this.names) > -1;
             }
           };
 MYNS.hasName('Peter'); //=>true