0

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

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

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

如何避免eval()

编辑:

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

http://pastebin.mozilla.org/1598528101

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

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

4

4 回答 4

3

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

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

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

如果您尝试使用 string 在某个容器中查找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. 如果namesvar在全局范围内(或隐式全局),window[params[0]]将为您提供对它的引用。

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

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


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

于 2012-04-26T07:34:07.110 回答
3

这还不够吗?

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

另外,注意比较

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

于 2012-04-26T07:34:45.133 回答
0

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

于 2012-04-26T08:02:11.487 回答
0

如果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
于 2012-04-26T08:23:00.283 回答