Когда все браузеры начали поддерживать String.replace(regexp, replace_function)?

Согласно 6-му изданию JavaScript: The Definitive Guide (Фланаган, 2011 г.):

ECMAScript v3 указывает, что аргумент замена для replace() может быть функцией, а не строкой.

Я смотрю на некоторый код, написанный в 2005 году, где сложный обходной путь использовался для замены частей строки. Комментарии к коду ясно указывают на то, что изначально он использовал функциональный метод replace(), но обходной путь был необходим для кроссбраузерной совместимости.

ECMAScript v3 вышел в 1999 году и, насколько я могу судить (из этого поста для обсуждения и эту запись в блоге), ECMAScript v3 поддерживается всеми основными браузерами с конца 2001 года. Мог ли автор ошибаться, или кто-нибудь может пролить свет на то, почему такой обходной путь мог быть необходим в 2005 году?

...

ОБНОВЛЕНИЕ Фактический комментарий автора кода гласит:

Лямбда-функции в регулярных выражениях в настоящее время являются проблемой для слишком многих браузеров.

изменил код, чтобы обойти.

Код автора работает или работает для этого бизнеса, хотя сам код вполне может быть личным проектом.


person guypursey    schedule 13.04.2013    source источник
comment
А может быть, многие пользователи до сих пор используют старые браузеры?   -  person JJJ    schedule 13.04.2013
comment
Возможно. Вот на что я надеюсь пролить свет.   -  person guypursey    schedule 13.04.2013
comment
Я думаю, что Юхана, вероятно, прав - все зависит от того, для чего использовался рассматриваемый код. Возможно, достаточное количество целевой аудитории использовало устаревшие браузеры; возможно, только один человек с устаревшей установкой пожаловался достаточно громко. Возможно, он был нацелен на некоторые браузеры не настольного класса, которые отставали от основных браузеров. Трудно сказать, не зная контекста   -  person Flambino    schedule 13.04.2013
comment
Спасибо @Flambino. Я думаю, что предоставил весь соответствующий контекст, какой только мог. Я не хотел включать код обходного пути, поскольку он не имеет отношения к вопросу (хотя я сделал ссылку на вопрос, в котором спрашиваю о версии обходного пути). Я надеялся, что кто-то с хорошей памятью или с лучшим набором закладок, чем у меня, по истории JavaScript и использования браузера сможет указать мне правильное направление :-)   -  person guypursey    schedule 13.04.2013
comment
Конечно, но не ждите однозначного ответа. Как вы сами говорите, обходной путь существует для поддержки необычных (даже для 2005 года) браузеров, но то, что было сочтено необходимым поддерживать их, было суждением. Если это не указано в комментарии или сообщении фиксации, и вы не можете спросить автора, мы, вероятно, никогда не узнаем. Под контекстом я подразумевал, является ли код частью небольшого личного сайта, большой корпоративной системы, библиотеки кода или чего-то еще. Каждый контекст имеет различные требования/допуски совместимости.   -  person Flambino    schedule 13.04.2013
comment
Еще раз спасибо @Flambino. Я не говорил, что существует обходной путь для поддержки «необычных браузеров». Я добавил комментарии автора к моему вопросу для контекста; в комментариях просто написано «слишком много браузеров». Вот что меня заинтересовало; насколько мне известно, многие браузеры поддерживали упомянутые им функции. Я думаю, мы никогда не узнаем, ошибался ли автор как таковой, но я подумал, что кто-то может выйти и сказать, что «требовался обходной путь, потому что в 2005 году преобладало использование ‹insert browser›» или «хотя ECMAScript v3 номинально поддерживался». , часть реализации глючила».   -  person guypursey    schedule 13.04.2013
comment
Кажется, я припоминаю время, когда не все это поддерживали, но это было давно. Кажется, так сказал даже MDN. Я просто не помню, какие браузеры, или если они поддерживали этот конкретный метод замены, какие были ошибки.   -  person JayC    schedule 13.04.2013
comment
Насколько я помню, Safari 2.x не поддерживал replace с функцией в качестве второго аргумента. Отчасти поэтому в Prototype.js мы использовали String#gsub (помимо имени метода в стиле rubyesque и некоторого дополнительного сахара). Быстрый поиск в Google показывает эту ошибку webkit: bugs.webkit.org/show_bug.cgi?id= 3294, так что, видимо, это было исправлено где-то в конце 2005 года. На основе phrogz.net/JS /replaceTest.html по-видимому, IEMac это тоже не поддерживал :) Все это означает, что вы можете смело использовать функцию-как-2-й-аргумент сегодня, если только не важна совместимость с такими динозаврами, как Saf 2 или IEMac.   -  person kangax    schedule 13.04.2013
comment
Возможно, вы слишком много читаете об этом. Слишком много могло быть 1% трафика, вы не можете сказать без контекста. Если вам нужна дополнительная информация, вам может помочь матрица поддержки ECMAScript. Если вы разместите свой вопрос на comp.lang.javascript группа новостей (для достижения наилучших результатов используйте программу чтения новостей), вы можете получить больше информации.   -  person RobG    schedule 15.04.2013
comment
@JayC Спасибо. У меня был хороший трал на страницах MDN. Если вы можете вспомнить или найти что-то актуальное, поделитесь, пожалуйста :-)   -  person guypursey    schedule 15.04.2013
comment
@kangax +1 Спасибо; это так же хорошо, как ответил на мой вопрос! Даже обходной путь, предложенный на странице Webkit, в основном тот, который я рассматривал. Я изменил грамматику в некоторых своих вопросах, чтобы учесть ваше мнение о том, что в наши дни его безопасно использовать (я предполагал это, но, возможно, раньше это было неясно). Если вы хотите опубликовать то, что вы сказали в качестве ответа, я буду рад принять это :-)   -  person guypursey    schedule 15.04.2013
comment
@RobG Спасибо за ссылку на матрицу поддержки. Это действительно полезно; Я возьму это в закладки для будущего использования. Я думаю, что kangax уже ответил на мой вопрос, но я могу обратиться в группу новостей, если мне понадобится больше подробностей или у меня возникнет аналогичный вопрос в будущем. Спасибо :-)   -  person guypursey    schedule 15.04.2013
comment
Спасибо всем за помощь в этом вопросе. Теперь я опубликовал ответ, который, я надеюсь, обобщает обсуждение здесь и включает немного больше информации. Я принял свой собственный ответ ради аккуратности, но был бы рад проголосовать (возможно, даже принять) другие ответы, если это уместно.   -  person guypursey    schedule 07.05.2013


Ответы (1)


Этот ответ основан на комментариях к вопросу выше (с особой благодарностью kangax, чей ответ я, вероятно, приму, если он решил оставить один!)

Хотя вполне возможно, что я мог прочитать «слишком много браузеров» буквально, также возможно, что String.replace() с функцией в качестве аргумента было проблемой в Safari 2.x (с использованием JavaScriptCore) и в IEMac 5.x в 2005 году. Доказательства этих проблем того времени существуют здесь, а также с этими конкретными версиями вышеупомянутые браузеры здесь.

На самом деле обходной путь, упомянутый Гэвином Кистнером на первой из этих страниц, — это тот, производительность которого может быть лучше в некоторых браузерах, чем метод функциональной замены, как обсуждалось здесь.

Тем не менее, помимо производительности, похоже (как я и подозревал), функциональная замена приемлема сегодня во всех браузерах.

Большое спасибо всем комментаторам этого вопроса.

person guypursey    schedule 07.05.2013