Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π½Π° JavaScriptΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 14

Автор ΠœΠ°Ρ€ΠΊ Кан

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ JavaScript Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ встроСнного ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° наслСдования, поэтому эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Для этого сущСствуСт нСсколько Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… способов. Один ΠΈΠ· Π½ΠΈΡ… состоит Π² использовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ call. Π­Ρ‚Π° функция позволяСт Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ· контСкста Π΄Ρ€ΡƒΠ³ΠΎΠΉ, Ρ‚.Π΅. ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ дСйствуСт ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово this. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ call ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ класс Animal (Π–ΠΈΠ²ΠΎΡ‚Π½ΠΎΠ΅), Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ· класса Cat ΠΈΠ»ΠΈ Dog.


function Animal(name){ this.name = name; this.species = 'Animal'; this.sleep = function(){ alert(this.name+' спит: Π₯Ρ€Ρ€Ρ€Ρ€'); } } function Cat(name){ Animal.call(this, name); this.talk = function(){ alert('ΠœΡΡƒ!'); } } function Dog(name){ Animal.call(this, name); this.talk = function(){ alert('Π“Π°Π²!'); } } var sam = new Cat('Sam'); var joe = new Dog('Joe'); sam.sleep(); // Sam спит: Π₯Ρ€Ρ€Ρ€Ρ€ joe.sleep(); // Joe спит: Π₯Ρ€Ρ€Ρ€Ρ€ sam.talk(); // ΠœΡΡƒ! joe.talk(); // Π“Π°Π²!


Π₯отя это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΌΡ‹ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ Π² своих возмоТностях. НапримСр, ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ дСйствуСт ΠΏΡ€ΠΈ использовании этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π°: всС ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹, Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° Animal, Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒΡΡ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Cat ΠΈΠ»ΠΈ Dog. Как ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π»Π΅ΠΊΡ†ΠΈΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ "this." Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр всякий Ρ€Π°Π· ΠΏΡ€ΠΈ создании Π½ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ ΠΏΡ€Π΅Π΄ΠΊΠ°. Π’ этом случаС всякий Ρ€Π°Π· ΠΏΡ€ΠΈ создании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Animal, Cat ΠΈΠ»ΠΈ Dog появляСтся новая копия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ species ΠΈ sleep. Как ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ, это Π½Π΅ самый эффСктивный способ.

Π›ΡƒΡ‡ΡˆΠΈΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ являСтся ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ всСго Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса Π½Π° классС-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ΅. Π­Ρ‚ΠΎ прСдоставляСт доступ ΠΊΠΎ всСм свойствам ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ класса ΠΏΡ€Π΅Π΄ΠΊΠ°:


function Animal(name){ this.name = name; } Animal.prototype = { species: 'Animal', sleep : function(){ alert(this.name+' спит: Π₯Ρ€Ρ€Ρ€Ρ€'); } } function Cat(name){ Animal.apply(this, arguments); } Cat.prototype = new Animal; Cat.prototype.species = 'Cat'; Cat.prototype.talk = function(){ alert('ΠœΡΡƒ!'); } function Dog(name){ Animal.apply(this, arguments); } Dog.prototype = new Animal; Dog.prototype.talk = function(){ alert('Π“Π°Π²!'); } var sam = new Cat('Sam'); var joe = new Dog('Joe'); sam.sleep(); // Sam спит : Π₯Ρ€Ρ€Ρ€Ρ€ joe.sleep(); // Joe спит: Π₯Ρ€Ρ€Ρ€Ρ€ alert(sam.species); // Cat alert(joe.species); // Animal - для Dog функция species Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°


МоТно ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ это дальшС ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠΎΡ€ΠΎΠ΄ собак ΠΈΠ»ΠΈ кошСк ΠΈ Ρ‚.Π΄.

Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ (сlosure) являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹Ρ… срСдств JavaScript. Если Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ простым объяснСниСм, Ρ‚ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ связываСт Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΈ внСшниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΠΎΡ‡Π΅ΠΌΡƒ это Ρ‚Π°ΠΊ Π²Π°ΠΆΠ½ΠΎ? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ позволяСт ΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‡Ρ‚ΠΈ любоС свойство любого языка программирования, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΎ Π½Π΅ сущСствуСт Π² JavaScript. Π­Ρ‚ΠΎ Π·Π²ΡƒΡ‡ΠΈΡ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ нСпонятно, поэтому Π»ΡƒΡ‡ΡˆΠ΅ Π½Π°Ρ‡Π°Ρ‚ΡŒ с Π±ΠΎΠ»Π΅Π΅ простого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:


function beginAdding(a){ a *= 5; return function finishAdding(b){ alert(a+b); } } var add = beginAdding(10); add(20); // 70


МоТно Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ 'a' присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 10 ΠΈ пСрСдаСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ beginAdding, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ 'b' присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 20 ΠΈ пСрСдаСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ finishAdding.

А Ρ‡Ρ‚ΠΎ содСрТится Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ 'add'? Она содСрТит Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ finishAdding с ΠΊΠΎΠΏΠΈΠ΅ΠΉ связанной с Π½Π΅ΠΉ всСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ beginAdding. Копия ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ 'a' ΠΈΠ· beginAdding сохраняСтся Π² памяти для дальнСйшСго использования.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, имСя прСдставлСниС ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΈ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти. Internet Explorer, Π² частности, ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½ достаточно нСприятным ΡƒΡ‚Π΅Ρ‡ΠΊΠ°ΠΌ памяти ΠΏΡ€ΠΈ использовании замыкания. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎ сборкС мусора Π² Internet Explorer, посмотрим, ΠΊΠ°ΠΊ Π² этом Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ выполняСтся очистка памяти ΠΎΡ‚ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Internet Explorer ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… сборщика мусора: ΠΎΠ΄ΠΈΠ½ для JavaScript ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² DOM. ΠŸΡ€ΠΈ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠ΅ страницы Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ просматриваСт ΠΈ удаляСт вСсь ΠΊΠΎΠ΄ JavaScript ΠΈ всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ DOM со страницы. Π£Ρ‚Π΅Ρ‡ΠΊΠ° происходит, ΠΊΠΎΠ³Π΄Π° ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ цикличСскиС ссылки ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° DOM Π² JavaScript ΠΈ снова Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ DOM ΠΈΠ»ΠΈ ΠΈΠ· JavaScript-->Dom-->Javascript. Internet Explorer запутываСтся ΠΈ Π½Π΅ удаляСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€ΠΈ цикличСской ссылкС.


var someInput = document.getElementById('inputbox'); var someFunction = function(){ alert(someInput.value); } someInput.onclick = someFunction;


Π—Π΄Π΅ΡΡŒ прСдставлСн бСсконСчный Ρ†ΠΈΠΊΠ» Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ DOM someInput Π²ΠΎΠ²Π»Π΅Ρ‡Π΅Π½ Π² Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ someFunction ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, поэтому Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΈΠΌΠ΅Π΅ΠΌ ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ памяти.

Замыкания ΡΠΎΠ·Π΄Π°ΡŽΡ‚, часто Π΄Π°ΠΆΠ΅ Π½Π΅ осознавая этого. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:


function Animal(name){ this.sleep = function(){ alert(name+' спит: Π₯Ρ€Ρ€Ρ€Ρ€'); } }


МоТно Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ этого, Π½ΠΎ пСрСмСнная 'name' Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sleep ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Animal. Π­Ρ‚ΠΎ создаСт Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅.

Π”Π°ΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅:


var x = 5; var n = function(){ y=10; return y; }


Π—Π΄Π΅ΡΡŒ Ρ‚Π°ΠΊΠΆΠ΅ создаСтся Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, хотя Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд это Π½Π΅ Ρ‚Π°ΠΊ. ΠŸΠΎΡ‡Π΅ΠΌΡƒ? Когда ΠΌΡ‹ создаСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ доступ ΠΊΠΎ всСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π² своСй Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ области дСйствия, поэтому ΠΌΡ‹ создаСм Π½ΠΎΠ²ΡƒΡŽ ссылку Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ….

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ подошли ΠΊ ΠΏΠΎΠ½ΡΡ‚ΠΈΡŽ области дСйствия. КаТдая функция ΠΈΠΌΠ΅Π΅Ρ‚ свою ΠΎΠ±Π»Π°ΡΡ‚ΡŒ дСйствия, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½Π° выполняСтся. ВсС области дСйствия ΠΊΠΎΠ΄Π° ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ стСкС памяти. Когда создаСтся Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΎΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ доступ ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· этих областСй дСйствия. Если создаСтся нСсколько Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ области дСйствия, Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΏΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ области дСйствия. НапримСр:


var x = 5; var alertX1 = function(){ alert(x); } x = 10; var alertX2 = function(){ alert(x); } alertX1(); alertX2();


ОбС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² этом случаС Π²Ρ‹Π²Π΅Π΄ΡƒΡ‚ 10. ΠŸΠΎΡ‡Π΅ΠΌΡƒ? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΠ±Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ копию Ρ….



Если ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ x Π² любой Ρ‚ΠΎΡ‡ΠΊΠ΅, Ρ‚ΠΎ ΠΎΠ±Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ отразят это. Как это ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ? ΠŸΡ€ΠΎΡ‰Π΅ всСго ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ дСйствия замыкания:


function makeClosure(x){ return function(){ alert(x); } } var x = 5; var alertX1 = makeClosure(x); x = 10; var alertX2 = makeClosure(x); alertX1(); // 5 alertX2(); // 10


Π­Ρ‚ΠΎ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. Если, ΠΎΠ΄Π½Π°ΠΊΠΎ, этот ΠΊΠΎΠ΄ создавал ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ памяти, Ρ‚ΠΎ ΡƒΡ‚Π΅Ρ‡ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ сущСствСнно большС, Ρ‡Π΅ΠΌ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅; ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ больший объСм памяти. ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ имССтся Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… области дСйствия Π² этом простом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:



МоТно Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ пСрСмСнная Ρ… копируСтся Π² ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΈΠ· Π΄Π²ΡƒΡ… областСй дСйствия. Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ x являСтся строкой ΠΈΠ»ΠΈ числом. JavaScript всСгда ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ строки ΠΈ числа ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ - Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ всСгда дСлаСтся копия ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π‘ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ всС происходит ΠΈΠ½Π°Ρ‡Π΅. Если Ρ… являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, массивом ΠΈΠ»ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Ρ‚ΠΎ Π² этом случаС ссылка Π² Π΄Π²ΡƒΡ… Π½Π°ΡˆΠΈΡ… функциях происходит Π½Π° ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ копию x ΠΈ поэтому Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΠΎΠ΅ сообщСниС Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ:


function makeClosure(x){ return function(){ alert(x.val); } } var x = {val:5}; var alertX1 = makeClosure(x); x.val = 10; var alertX2 = makeClosure(x); alertX1(); // 10 alertX2(); // 10


ΠžΡ‚Π»ΠΈΡ‡ΠΈΠ΅ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ x Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ. КаТдая ΠΈΠ· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… областСй дСйствия ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ копию x. ΠŸΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ значСния x ΠΎΠ½ΠΎ измСняСтся Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ области дСйствия, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ… упоминаСтся.

Как ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти ΠΏΡ€ΠΈ использовании Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ? НСобходимо ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ использования цикличСских ссылок. НаиболСС распространСнной ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти являСтся присоСдинСниС событий, Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ событиС onclick, ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ DOM.

Часто ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅Π²ΠΈΠ½Π½Ρ‹ΠΉ с Π²ΠΈΠ΄Ρƒ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ ΠΈ Π΅Π΅ Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΊΡ€Π°ΠΉΠ½Π΅ слоТно ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти достаточно Π»Π΅Π³ΠΊΠΎ. Если ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ страницы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ ΠΏΠ°ΠΌΡΡ‚ΡŒ увСличиваСтся, Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ. ΠžΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ, Π³Π΄Π΅ это происходит, ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ другая Π·Π°Π΄Π°Ρ‡Π°, Π½ΠΎ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ извСстно ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹!

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ лСкция Π±ΡƒΠ΄Π΅Ρ‚ посвящСн основам ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ AJAX!

ЛСкция 10. ΠžΡΠ½ΠΎΠ²Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ AJAX

ΠžΡΠ½ΠΎΠ²Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ AJAX. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° XMLHttp. Π’Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ получСния Π΄Π°Π½Π½Ρ‹Ρ…: XML, JSON ΠΈΠ»ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ тСкст. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ со списком ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ΠΎΠ².

Π’ послСднСС врСмя Ρ‚Π΅Ρ€ΠΌΠΈΠ½ AJAX ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΡˆΠΈΡ€ΠΎΠΊΠΎΠ΅ распространСниС. По сути, это Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, которая ΡƒΠΆΠ΅ Π΄Π°Π²Π½ΠΎ сущСствуСт. Однако Π·Π° послСдний Π³ΠΎΠ΄ JavaScript Π² стилС AJAX стал ΠΎΡ‡Π΅Π½ΡŒ популярным Ρƒ ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², ΠΈ ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ с Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стали ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ интСрСсныС Π²Π΅Ρ‰ΠΈ. Google Maps ΠΈ GMail ΡΠ²Π»ΡΡŽΡ‚ΡΡ двумя Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ извСстными прилоТСниями AJAX, Π½ΠΎ Π² послСднСС врСмя ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΏΠΎ всСму ΠΌΠΈΡ€Ρƒ Π½Π°Ρ‡Π°Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π½Π° своих сайтах.