0

学習のためだけに、 Function constructor でいくつかのテストを行っています)

だからここに話があります:

Function constructor よりも好ましい方法であるように、変数をその名前で取得するために(jsbin)evalを管理しました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))
}

ただし、数値をパラメーターとして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 に答える