我正在使用Function构造函数进行一些测试,仅用于学习)
所以这是故事:
由于Function constructor
是{em>首选的方式而非eval
,我已经管理(jsbin)以获取我的regex
变量名称
var my1Pattern=/\d/ig;
var my2Pattern=/\w/ig;
var my3Pattern=/\d+/ig;
var f=new Function( "return my"+3+"Pattern"); //3 or 2 or 1 , doesn't matter .
doWork(f()) //"[object RegExp]"
function doWork(r)
{
alert(Object.prototype.toString.apply(r))
}
但是,我希望将号作为参数发送给函数ctor。
所以,我尝试过替换:(jsbin#2)
var f=new Function("a", "return a")( "my"+5+"Pattern")
doWork(f)
但它提醒"string"
。 (这是正确的,因为我实际上发送了一个字符串)。
问题:
如何让第一个代码与 Function constructor
参数一起使用?
换句话说,我希望能够将一个数字作为参数/字符串发送到Function构造函数,因此它将返回正则表达式。
答案 0 :(得分:2)
根本不这样做。这太可怕了。
你没有告诉我们你想要做什么,但我相信它是这样的:
var myPattern = [
/\d/ig,
/\w/ig,
/\d+/ig
];
/** Apply my ith regex to str */
var f = function(str, i) {
return str.apply(myPattern[i]);
};
console.log(f("hello!", 0));
console.log(f("hello!", 1));
console.log(f("hello!", 2));
您可以尽可能多地抱怨您不希望使用数组,但这不会改变 此是正确方法的事实, 任何人推荐给你的方式都是荒谬可笑的。
我们不会通过名称的字符串版本获取对象的引用,既不使用eval
也不使用Function
构造函数。
答案 1 :(得分:2)
的补充
function (a) {
return eval("my"+a+"Pattern");
}
将是
function (a) {
return new Function("return my"+a+"Pattern")();
}
但是你知道不要使用它们中的任何一个: - )
答案 2 :(得分:2)
我认为唯一的方法是使用其他功能。
var f=new Function("a", "return a")( (new Function("return my"+3+"Pattern;")() );
doWork(f)