2012-02-06 2 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

+0

Свойство устарело, поэтому его больше не использовать и, вероятно, он не получит исправлений. См. Https://developer.mozilla.org/en/JavaScript/Reference/Deprecated_Features. Используйте другое выражение, чтобы включить строку в соответствие, которая вам нужна для 'if'. –

ответ

2

Как уже отмечалось, многие устаревшие свойства RegExp устарели. Использование другой синтаксис является более безопасным (и часто короче)

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

Возвращаемое значение: (String) 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

Смежные вопросы