我正在编写自定义验证程序包。其中一个要求是能够提供一个运行控制值的功能(例如检查两个密码匹配)。我希望能够做到这样的事情:
<input data-validator-func="validFn" .../>
每当输入发生变化时,请将输入文本作为参数调用此函数。我希望尽可能快地运行,所以要缓存它我想做的事情:
fn = eval("function(val) { " + $(elem).attr('data-validator-func') + "(val);}");
想法是预先编译一个函数调用,然后简单地执行:
valid = fn($(elem).val());
但是,当我尝试这个时,firefox会在初始eval上引发异常&#34; SyntaxError:function语句需要一个名称&#34;。
我不确定这里出了什么问题。有人可以帮忙吗?
答案 0 :(得分:1)
将它包裹在parens中可以使其正常工作
eval("( function(){} )");
特别针对您的代码
fn = eval("(function(val) { " + $(elem).attr('data-validator-func') + "(val);})");
答案 1 :(得分:1)
尝试:
var code = $(elem).attr('data-validator-func');
var fn = new Function('val', code).bind(elem);
这比eval
稍微狡猾,因为它不能将任何东西绑定到你的局部变量,只是因为它涉及较少的字符串摆弄。此外,bind
表示用户可以在函数中使用this
,它将引用该元素。
当然,更好的方法可能不是将JavaScript放在HTML属性中,但我不知道这里的整个故事。