我怎样才能避免在这个例子中使用'eval()'
How can I avoid using `eval()` in this example?
我正在尝试使用字符串作为对变量的引用以传递到函数中。例如:
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
)。
所以总结一下:
如果
names
是全局范围的var
(或隐式全局),window[params[0]]
将为您提供对它的引用。如果
names
已在某个容器对象中,则可以使用container[params[0]]
获取对它的引用。如果
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
- 避免在此模块中使用 eval
- Javascript:在为动态创建的对象设置 onClick 处理程序时避免 eval()
- 我怎样才能避免在这个例子中使用'eval()'
- 避免 EVAL 并传递 THIS 以运行
- 为什么在使用片段时可以避免使用键,但在使用数组时不能
- 我可以避免在这个例子中使用 eval 吗?
- 如何避免此javascript eval()
- 试图避免javascript eval()
- 在这种情况下你能避免重复吗
- 你能避免和Promises一起嵌套吗
- 试图避免eval从窗口对象获取数组元素
- 我怎么能有链接做不同的事情在Backbone.js不使用eval()
- 没有eval()不能启动Aurelia应用程序
- 按名称从指令访问作用域变量,避免使用eval
- 动态变量名,避免eval()
- 避免在raphael中使用eval.画板功能
- eval函数在JavaScript中不能正常工作
- 有人能帮我避免使用eval()吗
- 我怎么能避免把javascript在这个编辑模板
- 我能避免$scope吗?$watch返回一个未定义的值