0

我正在用 Function constructor 做一些测试,只是为了学习)

所以这是故事:

作为首选Function constructor 的方式,我已经管理(jsbin)通过它的名字来获取我的变量evalregex

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))
}

但是,我希望将数字作为参数发送给 Function ctor。

因此,我尝试替换:(jsbin#2

var f=new Function("a", "return a")( "my"+5+"Pattern")
 doWork(f)

但它会发出警报"string"。(这是正确的,因为我实际上是在发送一个字符串)。

问题 :

如何让第一个代码使用 Function constructor参数?

换句话说,我希望能够将一个数字作为参数/字符串发送到函数构造函数,因此它将返回正则表达式。

4

3 回答 3

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构造函数。

于 2013-03-18T16:40:09.543 回答
2

的补充

function (a) {
    return eval("my"+a+"Pattern");
}

将会

function (a) {
    return new Function("return my"+a+"Pattern")();
}

但是你知道不要使用它们中的任何一个:-)

于 2013-03-18T16:44:21.167 回答
2

我认为唯一的方法是使用另一个功能。

var f=new Function("a", "return a")( (new Function("return my"+3+"Pattern;")() );
doWork(f)
于 2013-03-19T07:38:16.963 回答