Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Вызов объекта из анонимной функции. Подскажите как работает код. (https://javascript.ru/forum/events/72667-vyzov-obekta-iz-anonimnojj-funkcii-podskazhite-kak-rabotaet-kod.html)

mnzi 16.02.2018 10:28

Вызов объекта из анонимной функции. Подскажите как работает код.
 
Здравствуйте. Наткнулся на такой код.

Не могу понять как работает, это замыкание?

Буду раз любой ссылке или подсказке.

(function(DinePage, $) {
    DinePage.init = function() {
        DinePage.autoResizeTopHeight();

        $(window).resize(function() {
            DinePage.autoResizeTopHeight();
        });

        setTimeout(DinePage.checkResizeHeight, 3000);
    };

    DinePage.autoResizeTopHeight = function() {
        var height = $('.dine-left').outerHeight();
        $('.dine-right').height(height);
    };

    DinePage.hasResized = false;
    DinePage.checkResizeHeight = function() {
        var timer = setInterval(function() {
            if (DinePage.hasResized) {
                clearInterval(timer);
                return;
            }

            DinePage.autoResizeTopHeight();
            DinePage.hasResized = true;
        }, 3000);
    };
})(window.DinePage = window.DinePage || {}, jQuery);


В функцию передается объект, но при этом он не инициализирован.

Вызвается в футере страницы так

$(document).ready(function() {
        DinePage.init();
    });

    $(document).load(function() {
        DinePage.autoResizeTopHeight();
    });


Спасибо.

ksa 16.02.2018 10:46

Цитата:

Сообщение от mnzi
Не могу понять как работает, это замыкание?

А где тут замыкание? :blink:
Есть только вызов безымянной функции, которой передается два параметра...

mnzi 16.02.2018 10:52

Передается $ (библиотка - в моем случае jQuery) и DinePage.

DinePage где-то должен объявляться? Как свойство объекта window? Я могу потом обращаться к нему как к глобальному объекту?

Зачем нужна такая запись через функцию? почему нельзя было объявить просто объект и присвоить свойствам значения функций?

Помогите разобраться пожалуйста.

ksa 16.02.2018 11:03

Цитата:

Сообщение от mnzi
DinePage где-то должен объявляться?

Судя по "конструкции"
Цитата:

Сообщение от mnzi
window.DinePage = window.DinePage || {}

Может и не объявляться... В этом случае будет передана ссылка "пустой" объект в глобальной переменной DinePage.
Цитата:

Сообщение от mnzi
DinePage где-то должен объявляться? Как свойство объекта window?

Если он не объявлен ранее его объявят пустым объектом при вызове
window.DinePage = window.DinePage || {};

Это стандартный прием... Кагбэ значение по умолчанию.
Цитата:

Сообщение от mnzi
Я могу потом обращаться к нему как к глобальному объекту?

Разумеется. :)

Nexus 16.02.2018 11:04

Цитата:

Сообщение от mnzi
DinePage где-то должен объявляться?

Он объявляется как свойство глобального объекта window при вызове функции.
Цитата:

Сообщение от mnzi
Я могу потом обращаться к нему как к глобальному объекту?

После вы можете обращаться к нему, как к любой переменной/объекту в глобальной ОВ.
До этого кода нужно сначала инициализировать этот объект и только после этого работать.

Цитата:

Сообщение от mnzi
Зачем нужна такая запись через функцию? почему нельзя было объявить просто объект и присвоить свойствам значения функций?

Возможно это было сделано для корректной работы объекта.
Если на странице одновременно используется и mootools, и jQuery, то есть вероятность того, что $ будет ссылкой на mootools (или на нечто другое, не являющееся экземпляром jQ).
Других причин я не вижу.

ksa 16.02.2018 11:05

Цитата:

Сообщение от mnzi
Зачем нужна такая запись через функцию? почему нельзя было объявить просто объект и присвоить свойствам значения

Ниндзя стайл! :D

ksa 16.02.2018 11:06

Цитата:

Сообщение от Nexus
Если на странице одновременно используется и mootools и jQuery, то есть вероятность того, что $ будет ссылкой на mootools.

Это уже про второй параметр... :)

Nexus 16.02.2018 11:14

Цитата:

Сообщение от ksa
Это уже про второй параметр

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

mnzi 16.02.2018 11:32

Огромное спасибо за разъяснения.

ksa 16.02.2018 11:45

Цитата:

Сообщение от Nexus
без второго первый работать как планировалось не будет

Разумеется. :yes:

Просто я думал, что большее недоумение у ТСа именно по первому параметру... :)


Часовой пояс GMT +3, время: 06:08.