@Valeriy1997

Как правильно понять этот код?

Так ка javaskriptom занимаюсь всего месяц. Еще не очень освоил детали . Нужно разъяснение по работе кода. А именно , что происходит в каждой строчке кода:

function preloadImages() {
    if (typeof arguments[arguments.length - 1] == 'function') {
        var callback = arguments[arguments.length - 1];
    } else {
        var callback = false;
    }
    if (typeof arguments[0] == 'object') {
        var images = arguments[0];
        var n = images.length;
    } else {
        var images = arguments;
        var n = images.length - 1;
    }
    var not_loaded = n;
    for (var i = 0; i < n; i++) {
        jQuery(new Image()).attr('src', images[i]).load(function() {
            if (--not_loaded < 1 && typeof callback == 'function') {
                callback();
            }
        });
    }
}
  • Вопрос задан
  • 341 просмотр
Решения вопроса 2
@iissakin
Сначала проверяются параметры, переданные в функцию: если последний параметр - функция, то она будет позже вызвана при загрузке изображений. Если нет, то изображения просто загрузятся.
В качестве первого параметра ожидается массив со ссылками на изображения, которые будут потом записаны в атрибут src новых dom-элементов img.

upd: колбек будет вызван, видимо, только после загрузки последнего изображения.
Ответ написан
function preloadImages() {
    // создаем функцию с помощью Function declaration (инструкции объявления функции)
    // как бы говорим интерпретатору "создай функцию и помести ее в переменную preloadImages"
    if (typeof arguments[arguments.length - 1] == 'function') {
    // в javascript нет "перегрузки" функций, функция может принимать сколько угодно значений
    // доступ к переданным аргументам можно осуществить через "псевдо-массив" arguments
    // arguments.length - возвращает количество переданных аргументов
    // в arguments можно обращаться к аргументу по номеру
    // arguments[arguments.length - 1] - последний параметр функции
    // typeof x - возвращает строку, содержащую информацию о типе операнда x
    // в конечном счете проверяется, является ли последний переданный аргумент функцией
        var callback = arguments[arguments.length - 1];
    // копируем ссылку на эту функцию в переменную callback
    // эта переменная еще в момент вхождения интерпретатора в функцию preloadImages поднимется и будет 
    // в лексическом окружении (LexicalEnvironment) функции
    } else {
        var callback = false;
    // иначе остаемся без коллбэка
    }
    if (typeof arguments[0] == 'object') {
    // если первый аргумент функции является объектом (всё, кроме чисел, строк, true, false, null, undefined)
    // здесь, видимо, мы ждем в первом параметре массив изображений
    // вызов вида preloadImages(['img1.jpg',..., 'imgN.jpg'])
        var images = arguments[0];
    // копируем ссылку из первого аргумента-объекта в переменную images
        var n = images.length;
    // записываем количество элементов в массиве в переменную
    } else {
    // если первый аргумент не объект,
    // скорее всего, на входе ждем список строк-урл картинок
    // preloadImages('img1.jpg',..., 'imgN.jpg')
        var images = arguments;
    // здесь уже копируем ссылку на весь список аргументов
        var n = images.length - 1;
    // записываем в переменную n количество параметров с вычетом одного,
    // видимо, задумывалось, что последним аргументом будет функция-callback
    // иначе последнее изображение не обработается
    }
    var not_loaded = n;
    // временная переменная, количество незагруженных изображений
    for (var i = 0; i < n; i++) {
    // обычный цикл с инкрементом на каждой итерации
        jQuery(new Image()).attr('src', images[i]).load(function() {
    // new Image() - создаем HTMLImageElement, 
    // jQuery(new Image()) - делаем из него jquery объект для возможности работы с ним с помощью методов jquery
    // .attr('src', images[i]) - проставляем объекту атрибут src, что сразу запустит загрузку изображения
    // load(function() { - и привяжемся к событию load изображения
            if (--not_loaded < 1 && typeof callback == 'function') {
    // сначала уменьшаем, потом сравниваем с 1 нашу временную переменную
    // отлавливаем когда у нас все изображения загрузятся,
    // порядок загрузки не важен тут
    // и если в переменную callback попала функция, то
                callback();
    // вызываем ее
            }
        });
      }
    }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы