В чем преимущество хранения данных в раскрывающемся объектном модульном объектном модуле, а не в качестве переменной внутри модуля? - PullRequest
1 голос
/ 11 апреля 2019

Я выполняю рефакторинг некоторого унаследованного кода, который использует шаблон раскрывающегося модуля, и есть экземпляры данных, хранящихся в модуле, на которые затем ссылаются позже в коде модуля. Кажется, что простое хранение данных в самом модуле в переменных было бы более распространенным и удобочитаемым подходом. Например, первый пример под функцией getPageLoadState устанавливает глобальное свойство для объекта / модуля main, к которому затем осуществляется доступ для определения логического значения. main.pageLoaded таким образом предоставляется клиенту в глобальной области видимости, и я Я не уверен, каковы преимущества. Во втором примере функция getPageLoadState удалена, и состояние полагается на переменную pageLoaded, локальную по отношению к module, чтобы определить, должны ли при выполнении loadData() получить некоторые данные или нет.

Текущая настройка:

var main = (function() {
    function init() {
        loadData(); //loads data
        loadData(); //does nothing
    }

    function getPageLoadState() { //exposes module.pageLoaded on first execution and returns boolean
        if (main.pageLoaded !== undefined) { //main.pageLoaded has been set
            return true;
        }
        main.pageLoaded = "true"; //set object 'pageLoaded' on main module to true on first execution of this function so subsequent runs will return true based in the if statement above
        return false; //return false on initial execution
    }

    function loadData() {
        var pageLoaded = getPageLoadState(); //returns false only on first execution
        if (!pageLoaded) {
            console.log("getting data");
        }
    }
    return {
        init: init
    };
})();
main.init();//"getting data"
console.log(main.pageLoaded); //"true"

Как бы я это сделал:

var main = (function() {
    var pageLoaded;

    function init() {
        loadData(); //loads data
        loadData(); //does nothing
    }

    function loadData() {
        if (!pageLoaded) { //condition is met only on first run of function when pageLoaded === undefined
            console.log("getting data");
            pageLoaded = true; //subsequent executions will not meet the if clause
        }
    }
    return {
        init: init
    }
})();
main.init();//"getting data"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...