2012-02-06 36 views
1

此功能在Chrome中引发“无效访问”错误,在IE(pirate_bar_pirate_baz)中返回错误结果,并在Firefox中正常工作(pirate_bar_ninja_baz)。如果从正则表达式中删除全局标志,它可以正常工作,但仅适用于第一个“foo”而不是两个。有什么问题?为什么RegExp.rightContext在匿名函数内引发无效访问错误?

regex = /foo/g; 
//regex = /foo/; 

"foo_bar_foo_baz".replace(regex, function(str) { 
    if (RegExp.rightContext == "_baz") { 
    return "ninja"; 
    } else { 
    return "pirate"; 
    } 
}); 
+0

似乎是一个错误。 ''xx“.replace(/ x/g,function(){RegExp.rightContext;});'也会抛出''非法访问''在Chrome中,而只是取得属性不应该这样做,我假设。 – pimvdb 2012-02-06 21:01:19

+0

该属性已弃用,因此不应再使用,可能不会收到修复程序。请参阅https://developer.mozilla.org/en/JavaScript/Reference/Deprecated_Features使用不同的表达式将字符串包含在您需要的if中。 – 2012-02-06 21:04:59

回答

2

正如已评论的,许多较早的RegExp属性已被弃用。 使用的另一种语法是安全的(且经常短)

var regex= /foo(?=_bar)?/g; 
"foo_bar_foo_baz".replace(regex, function(a, b){ 
    return b? "ninja":"pirate"; 
}); 

返回值:(字符串)pirate_bar_ninja_baz

+0

这不起作用。 “robots_foo_bar_foo_baz_foo_bar”返回“robots_ninja_bar_ninja_baz_ninja_bar”。预期的输出是“robots_ninja_bar_pirate_baz_ninja_bar”。 – adorr 2012-02-06 22:51:34

相关问题