Первое выражение в Javascript For Loop - что с запятой? - PullRequest
3 голосов
/ 24 ноября 2011

Я работаю с примером перетаскивания HTML5 http://www.sitepoint.com/html5-file-drag-and-drop/,, но не могу точно определить, что происходит в цикле в конце этой функции -

function FileSelectHandler(e) {

    // cancel event and hover styling
    FileDragHover(e);

    // fetch FileList object
    var files = e.target.files || e.dataTransfer.files;

    // process all File objects
    for (var i = 0, f; f = files[i]; i++) {
        ParseFile(f);
    }

}

КакНасколько я знаю, первое выражение должно быть просто i = 0.Что происходит с , f?Пока массив files содержит ключ i, i увеличивается, f анализируется, а затем снова ищет файлы [i], верно?

Ответы [ 6 ]

5 голосов
/ 24 ноября 2011

В цикле for вы можете иметь несколько инициализаторов, разделенных запятыми.Вот что у вас там в сочетании с ленивым (и вводящим в заблуждение) var.В данном конкретном случае это эквивалентно:

function FileSelectHandler(e) {
    var i, f, files;

    // cancel event and hover styling
    FileDragHover(e);

    // fetch FileList object
    files = e.target.files || e.dataTransfer.files;

    // process all File objects
    for (i = 0; f = files[i]; i++) {
        ParseFile(f);
    }
}

... потому что var - это , неправильно понятый в JavaScript.Но, вероятно, лучшим примером использования нескольких инициализаторов будет:

var a = [1, 2, 3], index, len;

for (index = 0, len = a.length; index < len; ++index) {
    // Do something with a[index]
}

Там, с удаленным вводящим в заблуждение var, мы можем видеть, что в начале оператора for есть два различных инициализатора.

2 голосов
/ 24 ноября 2011

Это просто объявление локальной переменной с именем f.

А (немного) более дружественная для jslint версия может быть:

function FileSelectHandler(e) {
    var files, i, f;

    // cancel event and hover styling
    FileDragHover(e);

    // fetch FileList object
    files = e.target.files || e.dataTransfer.files;

    // process all File objects
    for (i = 0; f = files[i]; i++) {
        ParseFile(f);
    }
}

Переменные в JavaScriptиметь function-scope, и, следовательно, объявление их в верхней части функции делает это более понятным.

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

2 голосов
/ 24 ноября 2011

, f просто объявляет другую переменную f. Условие выполняется до тех пор, пока индекс i не будет найден в присваивании f = files[i] (присваивание возвращает false, прерывая цикл). Этот цикл является эквивалентом:

for(var i=0; i < files.length; i++){
    var f = files[i];
    // rest of code
}
1 голос
/ 24 ноября 2011

Это просто еще одна инициализация переменной, которая запускается до запуска цикла for.

Поскольку все объявления в JavaScript поднимаются, i и f объявляются в верхней части функции;оба изначально установлены на undefined.Затем цикл инициализирует i до нуля, а f остается undefined.

. На каждом проходе цикла f устанавливается на files[i].Если это новое значение f является «ложным» - ноль, неопределенное, ложное, пустая строка, NaN - цикл завершается.В противном случае цикл выполняется снова.

0 голосов
/ 24 ноября 2011

var i=0, f объявляет переменные i и f (и инициализирует первое значение 0).

Если вы не объявите f, он станет глобальной переменной, которая может вызвать конфликты.

0 голосов
/ 24 ноября 2011

, f это просто объявление переменной.В первом наборе точек с запятой (var i = 0, f;) находятся объявления.

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