JavaScript "для (var i = 0; ...) {...}" несовместимости браузера? - PullRequest
7 голосов
/ 13 февраля 2012

Я давно не занимался серьезным программированием на JavaScript, и я пишу вводное руководство по языку для некоторых из моих коллег. Я хотел бы обсудить лучшие практики цикла, но есть одна маленькая деталь, которую я сохранил в затылке:

При зацикливании массивов я помню следующий шаблон, который небезопасен для использования, поскольку существуют основные браузеры, которые его не поддерживают:

for (var i = 0; i < ls.length; i++) { ... }

Вместо этого ключевое слово var должно быть перемещено из массива следующим образом:

var i;
for (i = 0; i < ls.length; i++) { ... }

Это правильно? Я почесал сеть и не могу это подтвердить. Некоторые старые браузеры не поддерживают первый метод? Если нет, то какие нет?

Ответы [ 6 ]

12 голосов
/ 13 февраля 2012

«Это правильно?»

Если мы не говорим о каком-то действительно очень старом браузере, я не знаю ни о какой подобной проблеме сбраузеры, используемые сегодня1012 * Это изменилось после ES6, который имеет область действия блока .

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

7 голосов
/ 13 февраля 2012

Вместо этого ключевое слово var должно быть перемещено из массива

Не обязательно. Дело в том, что вы НЕ должны забывать ключевое слово var до i, иначе оно превратится в переменную global . Так что хорошо, если вы сделаете:

for (var i = 0; i < ls.length; i++) { ... }

Вы можете улучшить производительность приведенного выше кода, создав переменные, которые содержат эту длину массива / коллекции, а не читая ее снова и снова с каждой итерацией:

for (var i = 0, len = ls.length; i < len; i++) { ... }

Кстати, не беспокойтесь о браузере, этот цикл должен работать во всех браузерах:)

0 голосов
/ 08 мая 2017

наткнулся на это сегодня

   for(var i=0; i < t; i++) {
//do whatever
}

мой jscript был в xsl-файле, вызванном из html-файла - нормально работал в IE, но не в других браузерах - код зависал и ничего не отображалось

к счастью, я мог изменить его на, который работал для всех протестированных браузеров

for(var i=0; i != t; i++) {
do whatever}

также знать https://support.microsoft.com/en-us/help/273793/how-to-include-client-side-script-functions-in-an-xsl-document

0 голосов
/ 13 февраля 2012

JavaScript фактически объявляет область действия уровня функции, а не область блока. Объявленные переменные поднимаются на вершину своей функции. То, что я говорю, ваши примеры на самом деле идентичны Даже с ключевым словом var в операторе for переменная i будет доступна вне цикла.

Единственное, на что вы должны обратить внимание, - если вы опустите var, то переменная будет глобальной, а не ограничена функцией.

0 голосов
/ 13 февраля 2012

Не то чтобы вы просили об этом, но вы можете использовать jQuery для этого следующим образом:

$.each(ls, function(i,value){
...
});
0 голосов
/ 13 февраля 2012

Если вы не поддерживаете браузеры старше IE6, это не должно быть проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...