我正在研究這個腳本,它允許您使用插值變量構建正則表達式。目前,我得到了這一點,它精美的作品:使用eval獲得範圍
function sRegExp(regex, vars) {
vars = Array.prototype.slice.call(arguments, 1);
regex = regex.toString();
var newRegex = regex.replace(/(^\/|\/$|\/([igm]+)$)/g, '')
.replace(/#\{(\d)\}/g, function(a, b) { return vars[ +b ]; });
var mods = regex.match(/\/([igm]+)$/);
return new RegExp(newRegex, mods ? mods[1] : '');
}
我用它像這樣:
function func() {
var foo = 'lol';
return sRegExp(/baz #{0}/i, foo);
}
console.log(func()); //=> /baz lol/i
我想通過使用變量名,而不必使用索引來提高這個腳本並通過在變量PARAMS,所以我想用eval
,讓我擺脫了vars
和重構的代碼位:與p
function sRegExp(regex) {
regex = regex.toString();
var newRegex = regex.replace(/(^\/|\/$|\/([igm]+)$)/g, '')
.replace(/#\{(\w+)\}/g, function(a, b) { return eval(b); });
__^__ __^__
var mods = regex.match(/\/([igm]+)$/);
return new RegExp(newRegex, mods ? mods[1] : '');
}
現在的問題revious例子是這樣的:
console.log(func()); //=> foo is not defined
但在全球範圍內...
var foo = 'lol';
function func() {
return sRegExp(/baz #{foo}/i);
}
console.log(func()); //=> /baz lol/i
如何設置的eval
上下文。我試過eval.call(func)
但這顯然沒有奏效。有任何想法嗎?
是的,這是一個好主意,但仍然很冗長,但我喜歡。看起來像我的_令人敬畏的idea_不是那麼可怕... – elclanrs
@elclanrs,好吧,如果你仍然想堅持使用全局範圍,那麼你可以使用'window' – Alexander