Я не понимаю, почему string.replace правильно выполняет функцию, содержащую переменную? - PullRequest
0 голосов
/ 13 октября 2011

В данный момент я читаю новую книгу по HTML5 (HTML5. Webseiten innovativ und zukunftssicher by Peter Kröner).Есть несколько примеров, как научить IE6-8 понимать HTML5.Одна стратегия выглядит следующим образом (если Javascript включен):

<!DOCTYPE html>
<html>
    <head>
         <meta charset="utf-8">
        <title>HTML5 in IE</title>
        <script>
            'abbr article aside audio canvas details figcaption
            figure footer header hgroup mark menu meter nav 
            output progress section summary time video'
            .replace(/\w+/g, function(n) {window.document.createElement(n)});
        </script>
    </head>
    <body>
    <section>
        <header>
                <h1>This is the header</h1>
        </header>
        <section>
            <h2>Chapter 1</h2>
                <p>
                Text, Text, Text, Text, Text...
                Text, Text, Text, Text, Text...
                Text, Text, Text, Text, Text...
                Text, Text, Text, Text, Text...     
                </p>
        </section>
        <footer>
            <p>
                This is the footer.
            </p>
        </footer>
     </section>
    </body>
</html>

Когда я открываю отладчик в IE, DOM верен.Когда я опускаю JS-функцию, DOM не работает.Так что этот пример работает.Я не понимаю, как на самом деле работает это выражение замены.Если я правильно понимаю string.replace, он должен был заменить строку самой функцией, но очевидно, что window.document.createElement был заменен и каким-то образом правильно выполнен с каждым «тегом», поэтому каждый «тег» был проанализирован функцией.Почему это работает?

Ответы [ 2 ]

1 голос
/ 13 октября 2011

Вы можете использовать функцию в качестве второго параметра метода replace() строки, чтобы заменить совпадающие символы в строке. Первым параметром, переданным функции, является строка, совпадающая с текущим соответствием регулярному выражению, которое в данном случае представляет собой каждое из имен тегов «abbr», «article» и т. Д., Которое затем передается в window.document.createElement().

Подробнее см. MDN .

0 голосов
/ 13 октября 2011
'abbr article aside audio'.replace(/\w+/g, function(n) { console.log(n); });

Производит:

abbr
article
aside
audio


.replace(regex, callback) выполнит обратный вызов с соответствием в качестве аргумента для каждого найденного соответствия.В вашем примере это свойство .replace() используется для создания элемента dom для каждого слова в строке.

Семантически эквивалентная реализация, использующая Array:

var elems = ['abbr', 'article', 'aside', 'audio'];
for(var i = 0; i < elems.length; i++) {
    window.document.createElement(elems[i]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...