2010-09-13 3 views
11

Пожалуйста, взгляните на следующий JavaScript. Я взял материал из этого, так что вы можете сосредоточиться на сути проблемы.Chrome V8 Bug? Функция, действующая по-разному после вызова 2-го раза

Вы заметите, что я дважды вызываю функцию prepPath в строке, проходящей в той же самой строке. В firefox и IE8 эта функция каждый раз предупреждает об истинности (как и ожидалось). Но, в Chromium 5.0.375.127 (55887) Ubuntu 10.04, функция возвращает true в первый раз, а false второй вызов, несмотря на то, что вход остается точно таким же!

<script type="text/javascript"> 
    function prepPath(str) 
    { 
     var regX = /[^\s/"'\\].*[^\s/"'\\]/g; 
     if(regX.test(str)) 
     { 
      alert("true: " + str); 
     } 
     else 
     { 
      alert("false; " + str); 
     } 
    } 

    prepPath("/desktop"); // alerts: true 
    prepPath("/desktop"); // alerts: false 
</script> 

Почему он возвращает ложь во второй раз в Chromium?

+2

Единственный раз, когда вам нужен флаг «g» в регулярном выражении, это если вы хотите использовать одно и то же выражение более одного раза, а lastIndex помечено между использованием. Без флага «g» ваш код работает так, как вы ожидали. Если вы установите regX.lastIndex = 0 после определения его, он также вернет ожидаемое значение. – kennebec

ответ

14

Существует некоторая двусмысленность в спецификации о том, когда литералы регулярных выражений должны быть сброшены (вспомните, что они имеют состояние). Вы можете обойти эту проблему, делая это:

var regX = new RegExp(/[^\s/"'\\].*[^\s/"'\\]/g); 

живой пример: http://jsbin.com/irate

или это:

var regX = /[^\s/"'\\].*[^\s/"'\\]/g; 
regX.lastIndex = 0; 

живой пример: http://jsbin.com/irate/2

Я сообщил, кто» я посмотрел на него больше, чем на то, что на самом деле это не ошибка, а двусмысленность. И это не просто Chrome, некоторые версии других браузеров также имеют аналогичную проблему.

+0

Это сработало; Спасибо. Необычно. Обычно, когда вы используете «var» перед установкой значения переменной (в функции), переменная является новой в любом случае и поддерживает только область уровня функции с нулевым состоянием между вызовами. –

+0

@ LonnieBest: О, это необычно, и это, конечно, выглядит неправильно, не так ли? Это связано с литеральным и когда они создаются, и действительно существует аргумент, что литерал создается экземпляром * один раз *, а затем повторно используется, как это ни странно. Это единственный пример этого странного поведения, о котором я знаю, если это какое-то утешение. :-) –

+1

Это на самом деле спецификация, которая требует такого поведения: http://bclary.com/2004/11/07/#a-7.8.5. В нем есть ошибка Chromium: http://code.google.com/p/chromium/issues/detail?id=2161. – lawnsea

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

  • Нет связанных вопросов^_^