Есть ли практическая причина, почему я бы выбрал замыкание над объектом? - PullRequest
1 голос
/ 21 октября 2010

В последнее время я получаю в ООП javascript и все больше и больше слышу о замыканиях. После дня извращения моего мозга я теперь понимаю их *, но я все еще не вижу преимущества перед использованием объекта. Кажется, они делают то же самое, но я подозреваю, что что-то упустил.

* я думаю

Редактировать

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

2-е редактирование

Ладно, мне удалось набрать чрезвычайно простого примера. Между этими двумя нет ничего особенного, но я нахожу объектную версию более читабельной. Почему я выбрал одно над другим?


/*** Closure way ***/

function closureCounter() {
    var count = 0;
    return {
        increase : function() {
            count++;
            alert(count);
        },
        decrease : function () {
            count--;
            alert(count);
        }
    };
}

var myCounter = closureCounter();

myCounter.increase();
myCounter.decrease();


/*** Object way ***/

function objCounter() {
    var count = 0;
    this.increase = function() {
        count++;
        alert(count);
    }
    this.decrease = function() {
        count--;
        alert(count);
    }

}

var myCounter = new objCounter();

myCounter.increase();
myCounter.decrease();





Ответы [ 2 ]

3 голосов
/ 23 октября 2010

Как сказал мастер, вы сравниваете яблоки и апельсины.

Объект - это просто набор пар ключ / значение. Закрытие относится к переменной области видимости. Вы можете создать замыкание в любом сценарии, обернув эту часть кода в функцию. Это создает новое замыкание в пределах этой функции.

http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/

Разница между вашими двумя примерами создания объектов связана с различными шаблонами написания классов / объектов в JS. Первый пример, который я считаю, называется шаблоном модуля? Второй пример - это еще один распространенный способ определения классов в JS, или вы также можете использовать прототип объекта для добавления этих методов.

Для получения дополнительной информации о том, как писать классы, попробуйте поискать "шаблоны классов js" (существует довольно много ресурсов с различными шаблонами - модуль, модуль раскрытия, синглтон и т. Д.)

3 голосов
/ 21 октября 2010

Вам не нужно рисковать дополнительными ошибками и путаницей, создавая совершенно новый объект, когда замыкание будет делать то же самое с более чистым и простым кодом. С замыканиями гораздо проще связать объекты.

Показательный пример:

function attachOnclick(eSource, eParent) {
    var e = document.createElement("div");
    eParent.appendChild(e);
    eSource.onclick = function() { e.style.backgroundColor = "881010"; }
}

против

var elemLinks = [];
function attachOnclick2(eSource, eParent) {
    var e = document.createElement("div");
    eParent.appendChild(e);
    elemLinks.push({elemSrc: eSource, elemDest: e}); // Append to mappings list
    eSource.onclick = changeColor;
}

function changeColor() {
    for(var i = elemLinks.length; i--;) {
        if(this == elemLinks[i].elemSrc) { // We've found our match
            elemLinks[i].elemDest.style.backgroundColor = "881010";
            return true;
        }
    }

    return false;
}

Если вы обнаружите какие-либо ошибки во втором примере, то это просто подтвердит мою точку зрения о том, что замыкания облегчают написание простого, более чистого кода.

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