epros Гость
|
Добавлено: Вт Апр 22 2003 15:45 Заголовок сообщения: Лямбда-выражение в JavaScript |
|
|
В нескольких справочниках написано, что в качестве второго параметра вызова метода replace вместо строки, подставляемой на место замещаемого фрагмента, можно использовать спецификацию функции. В этом случае при обнаружении замещаемого фрагмента будет вызываться данная функция и возвращаемое ей значение будет подставляться на место фрагмента. Такой синтаксис называется "лямбда-выражением".
Все прекрасно, но как передать этой функции результаты поиска фрагмента? То, что написано в справочниках, у меня почему-то ни фига не работает. В одном из справочников есть даже конкретный пример. Что-то типа этого:
result = source.replace(regular_expression, function (first_parameter) {return first_parameter.length;})
Утверждается, что в качестве певого параметра этой безымянной функции, спецификация которой вставлена прямо в выражение, будет передан найденный фрагмент строки source (следующие параметры используются для передачи других результатов поиска, таких как подфрагменты, выделенные в регулярном выражении круглыми скобками). Т.е. в результате мы должны получить строку, в которой искомые фрагменты заменены на числа, соответствующие их длинам.
У меня же вместо найденного фрагмента вставляется спецификация функции, прямо как она записана: "function (first_parameter) {return first_parameter.length;}"
Такой же эффект наблюдается при попытке вставки в качестве второго параметра replace имени определенной в другом месте функции без замыкающей его пары круглых скобок:
function FunctionName(...) { ... }
result = source.replace(regular_expression, functionName)
- в результат вставляется спецификация функции.
Ладно, этого можно было ожидать. Допустим, в справочнике написана ерунда. Попробуем вставить в качестве второго параметра replace не просто ссылку на функцию, а ее вызов:
result = source.replace(regular_expression, functionName())
Вроде бы это приводит к нужному результату: вместо найденных фрагментов вставляется значение, возвращаемое функцией. Но как передать этой функции результаты поиска, хотя бы - сам найденный фрагмент?
Я, кажется, уже все перепробовал: параметры функции, которые не были явно заданы при ее вызове, все оказываются undefined. Я даже пытался передавать в качестве параметра статический объект RegExp. Он передается, но все его свойства, в которых должны быть результаты последнего поиска, оказываются пустыми.
Может кто подскажет, как ПРАВИЛЬНО работать с лямбда-выражениями? Мои результаты получены на IE5.0 |
|
epros Гость
|
Добавлено: Ср Апр 23 2003 11:37 Заголовок сообщения: Ага, это наверное означает... |
|
|
... намек на то, что IE5.0 не поддерживает лямбда выражения внутри метода replace. Может оно и так, но в справочнике, который у меня сейчас под рукой, в статье про replace просто написано, что оно работает начиная с NN4 и IE3, а про лямбда-выражения нет никакого отдельного примечания - просто сказано, что его можно использовать. |
|
Chipollino Гость
|
Добавлено: Ср Апр 23 2003 12:08 Заголовок сообщения: Re: Ага, это наверное означает... |
|
|
Всё правильно - метод String.replace(rgExp, replaceText) присутствует уже в 1-ом JavaScript, который как раз поддерживают браузера, начиная с NN4 и IE3... Но фича, что параметр replaceText может быть функцией, наблюдается тока с JS 5.5...
Очень рекомендую MSDN Library - там вся версионность в документации отслеживается... |
|