我正在尝试使用字符串作为对变量的引用来传递给函数。例如:
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/1598528行data-qval
。
完整示例:http://jsfiddle.net/elclanrs/ZsS2D/29/
它目前有效,我只是在寻找摆脱101
...
答案 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
)。
总结一下:
如果names
在全球范围内是var
(或implicit global),则window[params[0]]
会为您提供参考。
如果某个容器对象中已有names
,您可以使用container[params[0]]
来获取对它的引用。
如果names
是函数中的var
,则无法使用不带eval
的运行时字符串来获取它;理想情况下,使用var names = [...];
而不是var container = {names: [...]};
,然后您可以使用container[params[0]]
。
请注意,您的函数名为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