我正在尝试使用字符串作为对变量的引用以传递到函数中。例如:
var names = ['Peter', 'John'],
var hasName = function(name){
var params = ['names'];
return $.inArray(name, eval( params[0] )) === -1;
};
如何避免eval()
?
编辑:
来自params[0]
的字符串来 self 的html中input
的data-qval
。包含实际数据的数组可以在任何地方声明,params[0]
只是对 data-qval
中作为字符串传入的数组的引用,它是一个参数。我在这里粘贴了我的插件代码。
http://pastebin.mozilla.org/1598528第101行
。
完整示例: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
)。
总结一下:
如果
names
是全局范围内的var
(或 implicit global ),则window[params[0]]
将为您提供引用。如果
names
已存在于某个容器对象中,您可以使用container[params[0]]
来获取对其的引用。如果
names
是函数内的var
,则无法使用没有eval
的运行时字符串来获取它;理想情况下,不要使用var names = [...];
,而是使用var container = {names: [...]};
,然后您可以使用容器[params[0]]
。
请注意,您的函数名为 hasName
,但当数组不具有名称时,它返回 true
,而 false
当它发生时。您可能需要 !== -1
,而不是 === -1
。
关于javascript - 如何避免在此示例中使用 `eval()`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10329039/