在javascript中预编译验证器函数

时间:2015-09-24 13:08:58

标签: javascript validation

我正在编写自定义验证程序包。其中一个要求是能够提供一个运行控制值的功能(例如检查两个密码匹配)。我希望能够做到这样的事情:

<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;。

我不确定这里出了什么问题。有人可以帮忙吗?

2 个答案:

答案 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属性中,但我不知道这里的整个故事。