在这个例子中如何避免使用`eval()`?

时间:2012-04-26 07:32:28

标签: javascript eval

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

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

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

如何避免eval()

修改

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

http://pastebin.mozilla.org/1598528data-qval

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

它目前有效,我只是在寻找摆脱101 ...

的方法

4 个答案:

答案 0 :(得分:3)

在这种特殊情况下,只需使用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(或implicit global),则window[params[0]]会为您提供参考。

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

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


  4. 请注意,您的函数名为hasName,但当数组 不具有名称时会返回true,而{<1}}则会返回false。您可能需要!== -1,而不是=== -1

答案 1 :(得分:3)

这还不够吗?

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

另外,请注意比较

  

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

答案 2 :(得分:0)

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

答案 3 :(得分: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