2012-07-16 5 views
8

Я просмотрел все другие (отличные) ответы на SO (особенно это: How do JavaScript closures work?), но я хотел получить ваши отзывы о моем понимании концепции.Является ли это допустимым прецедентом для закрытия javascript?

Я понимаю, что одним из вариантов использования является скрытие реализации частных методов из открытого доступа.

Другие один, что я думаю будут иметь его в качестве заводского генератора:

<script> 

function carFactory(make) { 

    var m = make; 
    return { manufacture: function (model) 

     {console.log("A " + m + " " + model + " has been created");} 

    } 
} 

toyotaFactory = carFactory("toyota"); 
hondaFactory = carFactory("honda"); 

toyotaFactory.manufacture("corolla"); 
toyotaFactory.manufacture("corolla"); 
hondaFactory.manufacture("civic"); 

</script> 

Это выходы:

A toyota corolla has been create 
A toyota corolla has been created 
A honda civic has been created 

Так что вы думаете, его действительный случай использования для закрытия (т.е. создание несколько заводов, использующих одну и ту же базу кода)? Или я могу добиться того же, используя что-то гораздо лучше?

Обратите внимание, что вопрос о технической реализации замыканий и о допустимых вариантах использования в дизайне/разработке приложений не так.

Спасибо.

+0

Выглядит нормально. – Almo

+0

Выглядит хорошо! Я не вижу в этом ничего плохого. – Linuxios

+3

Технически вам не нужно 'm' - вы можете просто использовать' make' напрямую. – josh3736

ответ

3

Да, сохранение переменных private является допустимым использованием для закрытия. Это позволяет вам иметь частный доступ к переменной, не делая ее публичным пользователем.

Смотрите эту ссылку на другие примеры: http://www.crockford.com/javascript/private.html

0

Затворы чрезвычайно мощный конструкт, с большим количеством полезных применений. Тот, который вы использовали там, на самом деле является «хаком». Наиболее распространенное использование для закрытий - это когда вы реализовали некоторую функциональность, которая «делает что-то» в середине ... И что «что-то» может быть настроено на все более или менее то, что вам нужно ... Например, функция jQuery ajax может «что-то сделать», когда запрос имеет ошибку или когда он претерпел и т. д. Если у вас не было закрытий, вы могли бы только передать «статически определенную» функцию, которая, вероятно, понадобится соберите контекст, необходимый для выполнения того, что вы хотите от глобальных переменных, или вам придется использовать одну и ту же подпись для всех функций, например, как это делается в C или C++, как функция (customData) {} ... Closures позволяет вы должны «динамически строить функции» во время выполнения, переосмысливая контекст, который у них есть, когда они были созданы, поэтому вы можете перейти к модулям, которые должны «что-то делать» почти все, что вы хотите, очень просто (в контракте с тем, что вы делали бы c или C++ или без закрытия res, что он уродливый, склонный к ошибкам и взломать тоже).

Поэтому, когда вы должны «настроить» некоторые пользовательские функции внутри что-то, вы будете использовать замыкание ...

1

Если я понять ваш вопрос правильно, вы не связаны с сохранением make собственности частного ? Если это так, то замыкание не является необходимым, и вы могли бы достичь того же функциональность с помощью прототипа ...

function carFactory(model){ 
    this.m = make; 
} 

carFactory.prototype.manufacture = function(model){ 
    console.log('A ' + this.m + ' ' + model + ' has been created'); 
} 

Который связан выигрыш в производительности (снижение памяти и увеличение скорости), согласно this question ,

+1

Сохраняет имя модели, но не сохраняет ее закрытой. Переменные участника доступны для всех.Преимущество закрытия OP заключается в том, что имя модели действительно конфиденциально. – jfriend00

+0

да, отредактировал мой ответ, чтобы быть более конкретным. это только работоспособный ответ, если держать 'make' private не нужно. если это так, то лучшим решением является замыкание. – market

+1

Я думал, что вся суть закрытия в вопросе ОП - это конфиденциальность. Я согласен с тем, что если конфиденциальность не требуется, то закрытие более сложное (и, вероятно, худшее потребление памяти), чем необходимо. Если public, переменная-член является самой простой. – jfriend00