ÐамÑÐºÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ ÑоÑнÑми ÑпоÑобов. Ðногда лÑди Ñами не замеÑаÑÑ, ÑÑо иÑполÑзовали замÑÐºÐ°Ð½Ð¸Ñ â наÑÑолÑко ÑÑо пÑоÑÑо и еÑÑеÑÑвенно.
Ð ÑÑой главе Ð¼Ñ ÑаÑÑмоÑÑим дополниÑелÑнÑе пÑимеÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¼Ñканий и задаÑи на ÑÑÑ ÑемÑ.
СÑÑÑÑик-обÑекÑ
Ранее Ð¼Ñ Ñделали ÑÑÑÑÑик.
ÐапомнÑ, как он вÑглÑдел:
function makeCounter() {
var currentCount = 1;
return function() {
return currentCount++;
};
}
var counter = makeCounter();
// каждÑй вÑзов возвÑаÑÐ°ÐµÑ ÑезÑлÑÑаÑ, ÑвелиÑÐ¸Ð²Ð°Ñ ÑÑÑÑÑик
alert( counter() ); // 1
alert( counter() ); // 2
alert( counter() ); // 3
СÑÑÑÑик полÑÑилÑÑ Ð²Ð¿Ð¾Ð»Ð½Ðµ ÑабоÑий, но Ð²Ð¾Ñ ÑолÑко возможноÑÑей ÐµÐ¼Ñ Ð½Ðµ Ñ
ваÑаеÑ. ХоÑоÑо бÑ, ÑÑÐ¾Ð±Ñ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло ÑбÑаÑÑваÑÑ Ð·Ð½Ð°Ñение ÑÑÑÑÑика или наÑинаÑÑ Ð¾ÑÑÑÑÑ Ñ Ð´ÑÑгого знаÑÐµÐ½Ð¸Ñ Ð²Ð¼ÐµÑÑо 1 или⦠Ðа много Ñего можно заÑ
оÑеÑÑ Ð¾Ñ Ð¿ÑоÑÑого ÑÑÑÑÑика и, Ñем более, в более ÑложнÑÑ
пÑоекÑаÑ
.
ЧÑÐ¾Ð±Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ ÑÑÑÑÑÐ¸ÐºÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑей â пеÑейдÑм Ñ ÑÑнкÑии на полноÑеннÑй обÑекÑ:
function makeCounter() {
var currentCount = 1;
return { // возвÑаÑим обÑÐµÐºÑ Ð²Ð¼ÐµÑÑо ÑÑнкÑии
getNext: function() {
return currentCount++;
},
set: function(value) {
currentCount = value;
},
reset: function() {
currentCount = 1;
}
};
}
var counter = makeCounter();
alert( counter.getNext() ); // 1
alert( counter.getNext() ); // 2
counter.set(5);
alert( counter.getNext() ); // 5
ТепеÑÑ ÑÑнкÑÐ¸Ñ makeCounter возвÑаÑÐ°ÐµÑ Ð½Ðµ Ð¾Ð´Ð½Ñ ÑÑнкÑиÑ, а обÑÐµÐºÑ Ñ Ð½ÐµÑколÑкими меÑодами:
getNext()â полÑÑиÑÑ ÑледÑÑÑее знаÑение, Ñо, ÑÑо ÑанÑÑе делал вÑзовcounter().set(value)â поÑÑавиÑÑ Ð·Ð½Ð°Ñение.reset()â обнÑлиÑÑ ÑÑÑÑÑик.
ÐÑе они полÑÑаÑÑ ÑÑÑÐ»ÐºÑ [[Scope]] на ÑекÑÑий (внеÑний) обÑÐµÐºÑ Ð¿ÐµÑеменнÑÑ
. ÐоÑÑÐ¾Ð¼Ñ Ð²Ñзов лÑбого из ÑÑиÑ
меÑодов бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ð¸Ð»Ð¸ модиÑиÑиÑоваÑÑ Ð¾Ð´Ð½Ð¾ и Ñо же внеÑнее знаÑение currentCount.
ÐбÑÐµÐºÑ ÑÑÑÑÑика + ÑÑнкÑиÑ
ÐзнаÑалÑно, ÑÑÑÑÑик делалÑÑ ÑÑнкÑией во многом Ñади кÑаÑивого вÑзова: counter(), коÑоÑÑй ÑвелиÑивал знаÑение и возвÑаÑал ÑезÑлÑÑаÑ.
Ð ÑожалениÑ, пÑи пеÑеÑ
оде на обÑÐµÐºÑ ÐºÐ¾ÑоÑкий вÑзов пÑопал, вмеÑÑо него ÑепеÑÑ counter.getNext(). Ðо он Ð²ÐµÐ´Ñ Ð±Ñл Ñаким пÑоÑÑÑм и ÑдобнÑмâ¦
ÐоÑÑÐ¾Ð¼Ñ Ð´Ð°Ð²Ð°Ð¹Ñе веÑнÑм его!
function makeCounter() {
var currentCount = 1;
// возвÑаÑаемÑÑ Ðº ÑÑнкÑии
function counter() {
return currentCount++;
}
// ...и добавлÑем ей меÑодÑ!
counter.set = function(value) {
currentCount = value;
};
counter.reset = function() {
currentCount = 1;
};
return counter;
}
var counter = makeCounter();
alert( counter() ); // 1
alert( counter() ); // 2
counter.set(5);
alert( counter() ); // 5
ÐÑаÑиво, не пÑавда ли? ÐолÑÑилÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑеннÑй обÑекÑ, коÑоÑÑй можно вдобавок еÑÑ Ð¸ вÑзÑваÑÑ.
ÐÑÐ¾Ñ ÑÑÑк ÑаÑÑо иÑполÑзÑеÑÑÑ Ð¿Ñи ÑазÑабоÑке JavaScript-библиоÑек. ÐапÑимеÑ, попÑлÑÑÐ½Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñека jQuery пÑедоÑÑавлÑÐµÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑÑ Ð¿ÐµÑеменнÑÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ jQuery (доÑÑÑпна Ñакже под коÑоÑким именем $), коÑоÑÐ°Ñ Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑоÑÐ¾Ð½Ñ ÑвлÑеÑÑÑ ÑÑнкÑией и Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзÑваÑÑÑÑ ÐºÐ°Ðº jQuery(...), а Ñ Ð´ÑÑгой â Ñ Ð½ÐµÑ ÐµÑÑÑ ÑазлиÑнÑе меÑодÑ, напÑÐ¸Ð¼ÐµÑ jQuery.type(123) возвÑаÑÐ°ÐµÑ Ñип аÑгÑменÑа.
Ðалее Ð²Ñ Ð½Ð°Ð¹Ð´ÑÑе ÑазлиÑнÑе задаÑи на понимание замÑканий. РекомендÑеÑÑÑ Ð¸Ñ ÑделаÑÑ ÑамоÑÑоÑÑелÑно.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)