From Philip
3. DOM optimization (events delegation, batches, doc fragment, throttle, debounce, unsubscribe, remove DOM refs in variables)
events delegation
ΠΡΠΏΠ»ΡΡΠΈΠ΅ ΠΈ ΠΏΠ΅ΡΠ΅Ρ Π²Π°Ρ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ°ΠΌΡΡ Π²Π°ΠΆΠ½ΡΡ ΠΏΡΠΈΡΠΌΠΎΠ² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ β Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅.
ΠΠ΄Π΅Ρ Π² ΡΠΎΠΌ, ΡΡΠΎ Π΅ΡΠ»ΠΈ Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΡΠΎΠ±ΡΡΠΈΡ Π½Π° ΠΊΠΎΡΠΎΡΡΡ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΏΠΎΡ ΠΎΠΆΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π½Π°Π·Π½Π°ΡΠ°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ, ΠΌΡ ΡΡΠ°Π²ΠΈΠΌ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½Π° ΠΈΡ ΠΎΠ±ΡΠ΅Π³ΠΎ ΠΏΡΠ΅Π΄ΠΊΠ°.
ΠΠ· Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ event.target
, ΠΏΠΎΠ½ΡΡΡ Π½Π° ΠΊΠ°ΠΊΠΎΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ΅ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π΅Π³ΠΎ.
table.onclick = function(event) {
let td = event.target.closest('td'); // (1)
if (!td) return; // (2)
if (!table.contains(td)) return; // (3)
highlight(td); // (4)
};
Π Π°Π·Π±Π΅ΡΡΠΌ ΠΏΡΠΈΠΌΠ΅Ρ:
ΠΠ΅ΡΠΎΠ΄
elem.closest(selector)
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π±Π»ΠΈΠΆΠ°ΠΉΡΠ΅Π³ΠΎ ΠΏΡΠ΅Π΄ΠΊΠ°, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΠ΅Π»Π΅ΠΊΡΠΎΡΡ. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π°ΠΌ Π½ΡΠΆΠ΅Π½<td>
, Π½Π°Ρ ΠΎΠ΄ΡΡΠΈΠΉΡΡ Π²ΡΡΠ΅ ΠΏΠΎ Π΄Π΅ΡΠ΅Π²Ρ ΠΎΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°.ΠΡΠ»ΠΈ
event.target
Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ Π²Π½ΡΡΡΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°<td>
, ΡΠΎ Π²ΡΠ·ΠΎΠ² Π²Π΅ΡΠ½ΡΡnull
, ΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄ΡΡ.ΠΡΠ»ΠΈ ΡΠ°Π±Π»ΠΈΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅,
event.target
ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ<td>
, Π½Π°Ρ ΠΎΠ΄ΡΡΠΈΠΉΡΡ Π²Π½Π΅ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΠ°Π±Π»ΠΈΡΡ. Π ΡΠ°ΠΊΠΈΡ ΡΠ»ΡΡΠ°ΡΡ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π»ΠΈ ΡΡΠΎ<td>
Π½Π°ΡΠ΅ΠΉ ΡΠ°Π±Π»ΠΈΡΡ.Π Π΅ΡΠ»ΠΈ ΡΡΠΎ ΡΠ°ΠΊ, ΡΠΎ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΈΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ.
Π ΠΈΡΠΎΠ³Π΅ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΠΊΠΎΡΠΎΡΠΊΠΈΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΊΠΈ, Π±ΡΡΡΡΡΠΉ ΠΈ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ, ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π½Π΅ Π²Π°ΠΆΠ½ΠΎ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΠ΅Π³ΠΎ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ <td>
.
doc fragment
documentFragment - "ΡΡΠ°Π³ΠΌΠ΅Π½Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°" Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π±Π»ΠΈΠ·ΠΎΠΊ ΠΏΠΎ ΡΠΌΡΡΠ»Ρ ΠΊ ΠΎΠ±ΡΡΠ½ΠΎΠΌΡ DOM-ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ.
ΠΡΡΠ°Π²ΠΈΡΡ ΠΏΠ°ΡΠΊΡ ΡΠ·Π»ΠΎΠ² Π΅Π΄ΠΈΠ½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ DocumentFragment
. ΠΡΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΡΠΉ ΠΊΡΠΎΡΡ-Π±ΡΠ°ΡΠ·Π΅ΡΠ½ΡΠΉ DOM-ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΡ
ΠΎΠΆ Π½Π° ΠΎΠ±ΡΡΠ½ΡΠΉ DOM-ΡΠ·Π΅Π», Π½ΠΎ ΠΈΠΌ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ.
Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π΄Π»Ρ Π΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ:
var fragment = document.createDocumentFragment();
Π Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ·Π»Ρ.
fragment.appendChild(node);
ΠΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ:
fragment.cloneNode(true); // ΠΊΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Ρ ΠΏΠΎΠ΄ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ
Π£ DocumentFragment
Π½Π΅Ρ ΠΎΠ±ΡΡΠ½ΡΡ
ΡΠ²ΠΎΠΉΡΡΠ² DOM-ΡΠ·Π»ΠΎΠ², ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ innerHTML
, tagName
ΠΈ Ρ.ΠΏ. ΠΡΠΎ Π½Π΅ ΡΠ·Π΅Π».
ΠΠ³ΠΎ Β«Π€ΠΈΡΠΊΠ°Β» Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° DocumentFragment
Π²ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π² DOM β ΡΠΎ ΠΎΠ½ ΠΈΡΡΠ΅Π·Π°Π΅Ρ, Π° Π²ΠΌΠ΅ΡΡΠΎ Π½Π΅Π³ΠΎ Π²ΡΡΠ°Π²Π»ΡΡΡΡΡ Π΅Π³ΠΎ Π΄Π΅ΡΠΈ. ΠΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΡ DocumentFragment
.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² Π½Π΅Π³ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ LI
, ΠΈ ΠΏΠΎΡΠΎΠΌ Π²ΡΠ·Π²Π°ΡΡ ul.appendChild(fragment)
, ΡΠΎ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΡΠ°ΡΡΠ²ΠΎΡΠΈΡΡΡ, ΠΈ Π² DOM Π²ΡΡΠ°Π²ΡΡΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ LI
, ΠΏΡΠΈΡΡΠΌ Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΡΡΠ΄ΠΊΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π±ΡΠ»ΠΈ Π²ΠΎ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ΅.
ΠΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄:
// Ρ
ΠΎΡΠΈΠΌ Π²ΡΡΠ°Π²ΠΈΡΡ Π² ΡΠΏΠΈΡΠΎΠΊ UL ΠΌΠ½ΠΎΠ³ΠΎ LI
// Π΄Π΅Π»Π°Π΅ΠΌ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠΉ DocumentFragment
var fragment = document.createDocumentFragment();
for (ΡΠΈΠΊΠ» ΠΏΠΎ li) {
fragment.appendChild(list[i]); // Π²ΡΡΠ°Π²ΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ LI Π² DocumentFragment
}
ul.appendChild(fragment); // Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ° Π²ΡΡΠ°Π²ΡΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠΏΠΈΡΠΊΠ°\
ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡ: ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Β«ΠΏΠΎΡΡΠΈΡΡΡΒ». Π’ΠΎΡΠ½Π΅Π΅ β ΠΎΠΏΡΡΡΠΎΡΠ°Π΅ΡΡΡ. ΠΠΎΠ³Π΄Π° ΠΌΡ Π΄Π΅Π»Π°Π΅ΠΌ div.appendChild(fragment)
, Π²ΡΠ΅ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ° ΠΏΠ΅ΡΠ΅Π½ΠΎΡΡΡΡΡ Π² div
. Π ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΈΠ· ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ° ΠΈΠ·ΡΠΌΠ°ΡΡΡΡ! Π§ΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ Π² ΡΠ»ΡΡΠ°Π΅, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ Π½Π΅ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ cloneNode
.
throttle and debounce
Π’ΡΠΎΡΡΠ»ΠΈΠ½Π³ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°Π·Π° Π² ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°Π· Π² 10 ΡΠ΅ΠΊΡΠ½Π΄). ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ β ΡΡΠΎΡΡΠ»ΠΈΠ½Π³ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ Π·Π°ΠΏΡΡΠΊ ΡΡΠ½ΠΊΡΠΈΠΈ, Π΅ΡΠ»ΠΈ ΠΎΠ½Π° ΡΠΆΠ΅ Π·Π°ΠΏΡΡΠΊΠ°Π»Π°ΡΡ Π½Π΅Π΄Π°Π²Π½ΠΎ. Π’ΡΠΎΡΡΠ»ΠΈΠ½Π³ ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ½ΠΎΡΡΡΡ.
Debouncing ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π²ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ Π±ΡΠ΄ΡΡ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ Π½Π΅ ΠΏΡΠ΅ΠΊΡΠ°ΡΡΡΡΡ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. Π’ΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ ΠΌΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΡΠ°ΠΉΠΌΠ΅Ρ Π½Π° 2 ΡΠ΅ΠΊΡΠ½Π΄Ρ, Π° ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ 10 ΡΠ°Π· Ρ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΎΠΌ Π² ΠΎΠ΄Π½Ρ ΡΠ΅ΠΊΡΠ½Π΄Ρ, ΡΠΎ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΡΠ·ΠΎΠ² ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΏΡΡΡΡ 2 ΡΠ΅ΠΊΡΠ½Π΄Ρ ΠΏΠΎΡΠ»Π΅ ΠΊΡΠ°ΠΉΠ½Π΅Π³ΠΎ (Π΄Π΅ΡΡΡΠΎΠ³ΠΎ) ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ ΡΡΠ½ΠΊΡΠΈΠΈ.
ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅: Π²ΠΈΠ΄Π΅ΠΎ ΠΈΠ³ΡΡ(ΡΡΠΎΡΡΠ»ΠΈΠ½Π³ Π΄Π»Ρ Π²ΡΡΡΡΠ΅Π»Π° Π² 1 ΡΠ΅ΠΊ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·), Π°Π²ΡΠΎΠ·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅(Π΅ΡΠ»ΠΈ Π±Ρ Π½Π΅ debounce ΠPI Π΄Π΅ΡΠ³Π°Π»ΡΡ Π±Ρ ΠΏΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π±ΡΠΊΠ²Ρ)
Useful link:
4. event.stopPropagation() vs event.preventDefault()
event.stopPropagation()
ΠΡΠΏΠ»ΡΡΠΈΠ΅ ΠΈΠ΄ΡΡ Ρ Β«ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎΒ» ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΏΡΡΠΌΠΎ Π½Π°Π²Π΅ΡΡ
. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠΎΠ±ΡΡΠΈΠ΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠ»ΡΠ²Π°ΡΡ Π΄ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° <html>
, Π° Π·Π°ΡΠ΅ΠΌ Π΄ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° document
, Π° ΠΈΠ½ΠΎΠ³Π΄Π° Π΄Π°ΠΆΠ΅ Π΄ΠΎ window
, Π²ΡΠ·ΡΠ²Π°Ρ Π²ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π½Π° ΡΠ²ΠΎΡΠΌ ΠΏΡΡΠΈ.
ΠΠΎ Π»ΡΠ±ΠΎΠΉ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½ΠΎ, ΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π²ΡΠΏΠ»ΡΡΠΈΠ΅.
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½ΡΠΆΠ½ΠΎ Π²ΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ event.stopPropagation()
.
ΠΡΠ»ΠΈ Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π½Π° ΠΎΠ΄Π½ΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅, ΡΠΎ Π΄Π°ΠΆΠ΅ ΠΏΡΠΈ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ΅Π½ΠΈΠΈ Π²ΡΠΏΠ»ΡΡΠΈΡ Π²ΡΠ΅ ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Ρ.
Π’ΠΎ Π΅ΡΡΡ, event.stopPropagation()
ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΡΠ΅Ρ ΠΏΡΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΡΠΎΠ±ΡΡΠΈΡ Π΄Π°Π»ΡΡΠ΅, Π½ΠΎ Π½Π° ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ΅ Π²ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π±ΡΠ΄ΡΡ Π²ΡΠ·Π²Π°Π½Ρ.
ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄ event.stopImmediatePropagation()
. ΠΠ½ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ Π²ΡΠΏΠ»ΡΡΠΈΠ΅, Π½ΠΎ ΠΈ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΡΠΎΠ±ΡΡΠΈΠΉ Π½Π° ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ΅.
event.preventDefault()
ΠΠ΅ΠΉΡΡΠ²ΠΈΡ Π±ΡΠ°ΡΠ·Π΅ΡΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
ΠΠ½ΠΎΠ³ΠΈΠ΅ ΡΠΎΠ±ΡΡΠΈΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²Π»Π΅ΠΊΡΡ Π·Π° ΡΠΎΠ±ΠΎΠΉ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π±ΡΠ°ΡΠ·Π΅ΡΠ°.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
ΠΠ»ΠΈΠΊ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅ ΠΈΠ½ΠΈΡΠΈΠΈΡΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ Π½Π° Π½ΠΎΠ²ΡΠΉ URL.
ΠΠ°ΠΆΠ°ΡΠΈΠ΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ Β«ΠΎΡΠΏΡΠ°Π²ΠΈΡΡΒ» Π² ΡΠΎΡΠΌΠ΅ β ΠΎΡΡΡΠ»ΠΊΡ Π΅Ρ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ.
ΠΠ°ΠΆΠ°ΡΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡΡΠΈ Π½Π°Π΄ ΡΠ΅ΠΊΡΡΠΎΠΌ ΠΈ Π΅Ρ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π² ΡΠ°ΠΊΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ β ΠΈΠ½ΠΈΡΠΈΠΈΡΡΠ΅Ρ Π΅Π³ΠΎ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅.
ΠΡΠ»ΠΈ ΠΌΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ ΡΠΎΠ±ΡΡΠΈΠ΅ Π² JavaScript, ΡΠΎ Π·Π°ΡΠ°ΡΡΡΡ ΡΠ°ΠΊΠΎΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π±ΡΠ°ΡΠ·Π΅ΡΠ° Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ. Π ΡΡΠ°ΡΡΡΡ, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΌΠ΅Π½ΠΈΡΡ.
ΠΡΡΡ Π΄Π²Π° ΡΠΏΠΎΡΠΎΠ±Π° ΠΎΡΠΌΠ΅Π½ΠΈΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π±ΡΠ°ΡΠ·Π΅ΡΠ°:
ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± β ΡΡΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ
event
. ΠΠ»Ρ ΠΎΡΠΌΠ΅Π½Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π±ΡΠ°ΡΠ·Π΅ΡΠ° ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄event.preventDefault()
.ΠΡΠ»ΠΈ ΠΆΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½Π°Π·Π½Π°ΡΠ΅Π½ ΡΠ΅ΡΠ΅Π·
on<ΡΠΎΠ±ΡΡΠΈΠ΅>
(Π½Π΅ ΡΠ΅ΡΠ΅Π·addEventListener
), ΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Π΅ΡΠ½ΡΡΡfalse
ΠΈΠ· ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°.
Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΡΠΈ ΠΊΠ»ΠΈΠΊΠ΅ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ Π½Π΅ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄ΡΡ:
<a href="/" onclick="return false">ΠΠ°ΠΆΠΌΠΈ Π·Π΄Π΅ΡΡ</a>
ΠΈΠ»ΠΈ
<a href="/" onclick="event.preventDefault()">Π·Π΄Π΅ΡΡ</a>
5. ΠΡΠΏΠ»ΡΡΠΈΠ΅/ΠΏΠΎΠ³ΡΡΠΆΠ΅Π½ΠΈΠ΅/ΠΏΠ΅ΡΠ΅Ρ
Π²Π°Ρ ΡΠΎΠ±ΡΡΠΈΡ
Π‘ΡΠ°Π½Π΄Π°ΡΡ DOM Events ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ 3 ΡΠ°Π·Ρ ΠΏΡΠΎΡ ΠΎΠ΄Π° ΡΠΎΠ±ΡΡΠΈΡ:
Π€Π°Π·Π° ΠΏΠΎΠ³ΡΡΠΆΠ΅Π½ΠΈΡ (capturing phase) β ΡΠΎΠ±ΡΡΠΈΠ΅ ΡΠ½Π°ΡΠ°Π»Π° ΠΈΠ΄ΡΡ ΡΠ²Π΅ΡΡ Ρ Π²Π½ΠΈΠ·.
Π€Π°Π·Π° ΡΠ΅Π»ΠΈ (target phase) β ΡΠΎΠ±ΡΡΠΈΠ΅ Π΄ΠΎΡΡΠΈΠ³Π»ΠΎ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ(ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ) ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°.
Π€Π°Π·Π° Π²ΡΠΏΠ»ΡΡΠΈΡ (bubbling stage) β ΡΠΎΠ±ΡΡΠΈΠ΅ Π½Π°ΡΠΈΠ½Π°Π΅Ρ Π²ΡΠΏΠ»ΡΠ²Π°ΡΡ.
ΠΡΠΈ Π½Π°ΡΡΡΠΏΠ»Π΅Π½ΠΈΠΈ ΡΠΎΠ±ΡΡΠΈΡ β ΡΠ°ΠΌΡΠΉ Π³Π»ΡΠ±ΠΎΠΊΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ½ΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ, ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΠΊΠ°ΠΊ Β«ΡΠ΅Π»Π΅Π²ΠΎΠΉΒ» (event.target
).
ΠΠ°ΡΠ΅ΠΌ ΡΠΎΠ±ΡΡΠΈΠ΅ ΡΠ½Π°ΡΠ°Π»Π° Π΄Π²ΠΈΠ³Π°Π΅ΡΡΡ Π²Π½ΠΈΠ· ΠΎΡ ΠΊΠΎΡΠ½Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° ΠΊ
event.target
, ΠΏΠΎ ΠΏΡΡΠΈ Π²ΡΠ·ΡΠ²Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ, ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ ΡΠ΅ΡΠ΅Π·addEventListener(...., true)
, Π³Π΄Π΅true
β ΡΡΠΎ ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ{capture: true}
.ΠΠ°Π»Π΅Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π½Π° ΡΠ΅Π»Π΅Π²ΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ΅.
ΠΠ°Π»Π΅Π΅ ΡΠΎΠ±ΡΡΠΈΠ΅ Π΄Π²ΠΈΠ³Π°Π΅ΡΡΡ ΠΎΡ
event.target
Π²Π²Π΅ΡΡ ΠΊ ΠΊΠΎΡΠ½Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°, ΠΏΠΎ ΠΏΡΡΠΈ Π²ΡΠ·ΡΠ²Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ, ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ ΡΠ΅ΡΠ΅Π·on<event>
ΠΈaddEventListener
Π±Π΅Π· ΡΡΠ΅ΡΡΠ΅Π³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΈΠ»ΠΈ Ρ ΡΡΠ΅ΡΡΠΈΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΡΠ°Π²Π½ΡΠΌfalse
.
ΠΠ°ΠΆΠ΄ΡΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΈΠΌΠ΅Π΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌ ΡΠΎΠ±ΡΡΠΈΡ event
:
event.target
β ΡΠ°ΠΌΡΠΉ Π³Π»ΡΠ±ΠΎΠΊΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅.event.currentTarget
(=this
) β ΡΠ»Π΅ΠΌΠ΅Π½Ρ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΠ°Π±ΠΎΡΠ°Π» ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ (ΡΠΎΡ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ Β«Π²ΠΈΡΠΈΡΒ» ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ)event.eventPhase
β Π½Π° ΠΊΠ°ΠΊΠΎΠΉ ΡΠ°Π·Π΅ ΠΎΠ½ ΡΡΠ°Π±ΠΎΡΠ°Π» (ΠΏΠΎΠ³ΡΡΠΆΠ΅Π½ΠΈΠ΅=1, ΡΠ°Π·Π° ΡΠ΅Π»ΠΈ=2, Π²ΡΠΏΠ»ΡΡΠΈΠ΅=3).
ΠΡΠ±ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΠ±ΡΡΠΈΠ΅ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ event.stopPropagation()
, Π½ΠΎ Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ ΡΡΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡΡ, ΠΈΠ½ΠΎΠ³Π΄Π° Π΄Π»Ρ ΡΠ°ΠΌΡΡ
Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΡ
Π²Π΅ΡΠ΅ΠΉ.
ΠΡΠ°ΠΊ, ΠΏΡΠΈ ΠΊΠ»ΠΈΠΊΠ΅ Π½Π° <td>
ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΏΡΡΠ΅ΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΏΠΎ ΡΠ΅ΠΏΠΎΡΠΊΠ΅ ΡΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ ΡΠ½Π°ΡΠ°Π»Π° Π²Π½ΠΈΠ· ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ (ΠΏΠΎΠ³ΡΡΠΆΠ°Π΅ΡΡΡ), Π·Π°ΡΠ΅ΠΌ ΠΎΠ½ΠΎ Π΄ΠΎΡΡΠΈΠ³Π°Π΅Ρ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ (ΡΠ°Π·Π° ΡΠ΅Π»ΠΈ), Π° ΠΏΠΎΡΠΎΠΌ ΠΈΠ΄ΡΡ Π½Π°Π²Π΅ΡΡ
(Π²ΡΠΏΠ»ΡΡΠΈΠ΅), Π²ΡΠ·ΡΠ²Π°Ρ ΠΏΠΎ ΠΏΡΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ.
ΠΡΠΏΠ»ΡΡΠΈΠ΅ ΠΈΠ΄ΡΡ ΠΏΡΡΠΌΠΎ Π½Π°Π²Π΅ΡΡ
. ΠΠ±ΡΡΠ½ΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠ»ΡΠ²Π°ΡΡ Π½Π°Π²Π΅ΡΡ
ΠΈ Π½Π°Π²Π΅ΡΡ
, Π΄ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° <html>
, Π° Π·Π°ΡΠ΅ΠΌ Π΄ΠΎ document
, Π° ΠΈΠ½ΠΎΠ³Π΄Π° Π΄Π°ΠΆΠ΅ Π΄ΠΎ window
, Π²ΡΠ·ΡΠ²Π°Ρ Π²ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π½Π° ΡΠ²ΠΎΡΠΌ ΠΏΡΡΠΈ.
ΠΠΎ Π»ΡΠ±ΠΎΠΉ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½ΠΎ, ΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π²ΡΠΏΠ»ΡΡΠΈΠ΅.
ΠΠ»Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π²ΡΠΏΠ»ΡΡΠΈΡ Π½ΡΠΆΠ½ΠΎ Π²ΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ event.stopPropagation()
.
Π§Π°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠ΅ΡΡ ΠΈΠ΄Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎ Π²ΡΠΏΠ»ΡΡΠΈΠΈ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π΄ΡΡΠ³ΠΈΠ΅ ΡΡΠ°Π΄ΠΈΠΈ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΈ ΠΏΡΠΎΡ ΠΎΠ΄ΡΡ Π½Π΅Π·Π°ΠΌΠ΅ΡΠ½ΠΎ Π΄Π»Ρ Π½Π°Ρ.
ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠ΅ ΡΠ΅ΡΠ΅Π· on<event>
-ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π· HTML-Π°ΡΡΠΈΠ±ΡΡΡ, ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π· addEventListener(event, handler)
Ρ Π΄Π²ΡΠΌΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π·Π½Π°ΡΡ ΠΎ ΡΠ°Π·Π΅ ΠΏΠΎΠ³ΡΡΠΆΠ΅Π½ΠΈΡ, Π° ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° 2-ΠΎΠΉ ΠΈ 3-Π΅ΠΉ ΡΠ°Π·Π°Ρ
.
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠΉΠΌΠ°ΡΡ ΡΠΎΠ±ΡΡΠΈΠ΅ Π½Π° ΡΡΠ°Π΄ΠΈΠΈ ΠΏΠΎΠ³ΡΡΠΆΠ΅Π½ΠΈΡ, Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ΅ΡΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ capture
Π²ΠΎΡ ΡΠ°ΠΊ:
elem.addEventListener(..., {capture: true})
// ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ "true", ΠΊΠ°ΠΊ ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ {capture: true}
elem.addEventListener(..., true)
Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ Π΄Π²Π° Π²Π°ΡΠΈΠ°Π½ΡΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΎΠΏΡΠΈΠΈ capture
:
ΠΡΠ»ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ
false
(ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ), ΡΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠΉΠΌΠ°Π½ΠΎ ΠΏΡΠΈ Π²ΡΠΏΠ»ΡΡΠΈΠΈ.ΠΡΠ»ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ
true
, ΡΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ΅Π½ΠΎ ΠΏΡΠΈ ΠΏΠΎΠ³ΡΡΠΆΠ΅Π½ΠΈΠΈ.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Ρ ΠΎΡΡ ΠΈ ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ 3 ΡΠ°Π·Ρ, 2-ΡΡ ΡΠ°Π·Ρ (Β«ΡΠ°Π·Ρ ΡΠ΅Π»ΠΈΒ»: ΡΠΎΠ±ΡΡΠΈΠ΅ Π΄ΠΎΡΡΠΈΠ³Π»ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°) Π½Π΅Π»ΡΠ·Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ, ΠΏΡΠΈ Π΅Ρ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π²ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ: ΠΈ Π½Π° Π²ΡΠΏΠ»ΡΡΠΈΠ΅, ΠΈ Π½Π° ΠΏΠΎΠ³ΡΡΠΆΠ΅Π½ΠΈΠ΅.
6. ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅/Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ ΠΏΠΎ DOM

OR

node.parentNode; // ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΡΠ·Π΅Π»
node.previousSibling; // ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ, Π½Π° ΡΡΠΎΠΌ ΠΆΠ΅ ΡΡΠΎΠ²Π½Π΅, ΡΠ·Π΅Π»
node.nextSibling; // ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ, Π½Π° ΡΡΠΎΠΌ ΠΆΠ΅ ΡΡΠΎΠ²Π½Π΅, ΡΠ·Π΅Π»
node.firstChild; // ΠΏΠ΅ΡΠ²ΡΠΉ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ
node.lastChild; // ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ
JS:
1. Modules types in JS
ΠΠΎΠ΄ΡΠ»ΠΈ β ΡΡΠΎ ΠΏΠ°ΡΡΠ΅ΡΠ½, ΠΊΠΎΡΠΎΡΡΠΉ Π² ΡΠ°Π·Π½ΡΡ ΡΠΎΡΠΌΠ°Ρ ΠΈ Π½Π° ΡΠ°Π·Π½ΡΡ ΡΠ·ΡΠΊΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ Ρ 60-Ρ ΠΈ 70-Ρ Π³ΠΎΠ΄ΠΎΠ².
Π ΠΈΠ΄Π΅Π°Π»Π΅, ΠΌΠΎΠ΄ΡΠ»ΠΈ JavaScript ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π½Π°ΠΌ:
Π°Π±ΡΡΡΠ°Π³ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌ, ΡΠ°ΠΊ ΡΡΠΎ Π½Π°ΠΌ Π½Π΅ ΠΏΡΠΈΠ΄ΡΡΡΡ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡΡΡ Π²ΠΎ Π²ΡΠ΅Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΡ ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ;
ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄, ΡΠΊΡΡΠ²Π°Ρ Π΅Π³ΠΎ Π²Π½ΡΡΡΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ, Π΅ΡΠ»ΠΈ Π½Π΅ Ρ ΠΎΡΠΈΠΌ, ΡΡΠΎΠ±Ρ Π΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΠ»ΠΈ;
ΠΏΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄, ΠΈΠ·Π±Π°Π²Π»ΡΡΡΡ ΠΎΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΠΈΡΠ°ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅ ΡΠ½ΠΎΠ²Π° ΠΈ ΡΠ½ΠΎΠ²Π°;
ΡΠΏΡΠ°Π²Π»ΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ, Π»Π΅Π³ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°ΡΡ Π½Π°Ρ ΠΊΠΎΠ΄.
Π€ΠΎΡΠΌΠ°ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ
Π€ΠΎΡΠΌΠ°Ρ ΠΌΠΎΠ΄ΡΠ»Ρ β ΡΡΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π΅Π³ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ.
ΠΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ECMAScript 6, ΠΈΠ»ΠΈ ES2015, Π² JavaScript Π½Π΅ Π±ΡΠ»ΠΎ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ. Π Π·Π½Π°ΡΠΈΡ, ΠΎΠΏΡΡΠ½ΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π»ΠΈ ΡΠ°Π·Π½ΡΠ΅ ΡΠΎΡΠΌΠ°ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ.
ΠΠΎΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ ΠΈ ΡΠΈΡΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ :
Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ (Asynchronous Module Definition ΠΈΠ»ΠΈ AMD);
CommonJS;
ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ (Universal Module Definition ΠΈΠ»ΠΈ UMD);
System.register;
ΡΠΎΡΠΌΠ°Ρ ΠΌΠΎΠ΄ΡΠ»Ρ ES6.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· Π½ΠΈΡ , ΡΡΠΎΠ±Ρ Π²Ρ ΡΠΌΠΎΠ³Π»ΠΈ ΡΠ°ΡΠΏΠΎΠ·Π½Π°ΡΡ ΠΈΡ ΠΏΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΡ.
ΠΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ (AMD)
Π€ΠΎΡΠΌΠ°Ρ AMD ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ°Ρ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΡΡΠ½ΠΊΡΠΈΡ define:
//ΠΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ define Ρ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΈ ΡΠ°Π±ΡΠΈΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ
define(['dep1', 'dep2'], function (dep1, dep2) {
//ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
return function () {};
});
Π€ΠΎΡΠΌΠ°Ρ CommonJS
Π€ΠΎΡΠΌΠ°Ρ CommonJS ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π² Node.js ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΈ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ require ΠΈ module.exports:
var dep1 = require('./dep1');
var dep2 = require('./dep2');
module.exports = function(){
// ...
}
Π£Π½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ (UMD)
Π€ΠΎΡΠΌΠ°Ρ UMD ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ ΠΊΠ°ΠΊ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅, ΡΠ°ΠΊ ΠΈ Π² Node.js.
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ
define(['b'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node. ΠΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ CommonJS Π½Π°ΠΏΡΡΠΌΡΡ,
// ΡΠΎΠ»ΡΠΊΠΎ CommonJS-ΠΎΠ±ΡΠ°Π·Π½ΡΠΌΠΈ ΡΡΠ΅Π΄Π°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ
// module.exports, ΠΊΠ°ΠΊ Node.
module.exports = factory(require('b'));
} else {
// ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π±ΡΠ°ΡΠ·Π΅ΡΠ° (root ΡΡΠΎ window)
root.returnExports = factory(root.b);
}
}(this, function (b) {
//ΠΊΠ°ΠΊ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ b.
// ΠΡΠΎΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΌΠΎΠ΄ΡΠ»Ρ.
// ΠΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ, Π½ΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ
// ΠΌΠΎΠΆΠ΅Ρ Π²Π΅ΡΠ½ΡΡΡ ΠΈ ΡΡΠ½ΠΊΡΠΈΡ ΠΊΠ°ΠΊ ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
return {};
}));
System.registerΠ
Π€ΠΎΡΠΌΠ°Ρ System.register Π±ΡΠ» ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½ Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ES6 Π² ES5:
import { p as q } from './dep';
var s = 'local';
export function func() {
return q;
}
export class C {
}
Π€ΠΎΡΠΌΠ°Ρ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ES6
Π ES6 JavaScript ΡΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π½Π°ΡΠΈΠ²Π½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ.
ΠΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΎΠΊΠ΅Π½ export Π΄Π»Ρ ΡΠΊΡΠΏΠΎΡΡΠ° ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎΠ³ΠΎ API ΠΌΠΎΠ΄ΡΠ»Ρ:
// lib.js
// ΠΠΊΡΠΏΠΎΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ
export function sayHello(){
console.log('Hello');
}
// ΠΠ΅ ΡΠΊΡΠΏΠΎΡΡΠ΅ΠΌΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ
function somePrivateFunction(){
// ...
}
ΠΈ ΡΠΎΠΊΠ΅Π½ import Π΄Π»Ρ ΠΈΠΌΠΏΠΎΡΡΠ° ΡΠ°ΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅Ρ:
import { sayHello } from './lib';
sayHello();
// Hello
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π°ΠΆΠ΅ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°ΡΡ ΠΈΠΌΠΏΠΎΡΡΡ Π°Π»ΠΈΠ°Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ as:
import { sayHello as say } from './lib';
say();
// Hello
ΠΈΠ»ΠΈ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΡΡΠ°Π·Ρ Π²Π΅ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ:
import * as lib from './lib';
lib.sayHello();
// Hello
Π€ΠΎΡΠΌΠ°Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠΊΡΠΏΠΎΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ:
// lib.js
// ΠΠΊΡΠΏΠΎΡΡ Π΄Π΅ΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ
export default function sayHello(){
console.log('Hello');
}
// ΠΠΊΡΠΏΠΎΡΡ Π½Π΅Π΄Π΅ΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ
export function sayGoodbye(){
console.log('Goodbye');
}
ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΊ:
import sayHello, { sayGoodbye } from './lib';
sayHello();
// Hello
sayGoodbye();
// Goodbye
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ, Π½ΠΎ ΠΈ Π²ΡΡ, ΡΡΠΎ ΠΏΠΎΠΆΠ΅Π»Π°Π΅ΡΠ΅:
// lib.js
// ΠΠΊΡΠΏΠΎΡΡ Π΄Π΅ΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ
export default function sayHello(){
console.log('Hello');
}
// ΠΠΊΡΠΏΠΎΡΡ Π½Π΅Π΄Π΅ΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ
export function sayGoodbye(){
console.log('Goodbye');
}
// ΠΠΊΡΠΏΠΎΡΡ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
export const apiUrl = '...';
// ΠΠΊΡΠΏΠΎΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
export const settings = {
debug: true
}
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π½Π°ΡΠΈΠ²Π½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΠΏΠΎΠΊΠ° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π½Π΅ Π²ΡΠ΅ Π±ΡΠ°ΡΠ·Π΅ΡΡ.
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΡΠΌΠ°Ρ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ES6 ΡΠΆΠ΅ ΡΠ΅Π³ΠΎΠ΄Π½Ρ, Π½ΠΎ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Babel, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡ Π½Π°Ρ ΠΊΠΎΠ΄ Π² ΡΠΎΡΠΌΠ°Ρ ES5, ΡΠ°ΠΊΠΎΠΉ, ΠΊΠ°ΠΊ AMD ΠΈΠ»ΠΈ CommonJS, ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠ΅Π½ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅.
Useful link:
2. Encapsulation in JS
ΠΠ»Π°ΡΡΡ Get, Set in object ΠΠ°ΠΌΡΠΊΠ°Π½ΠΈΠ΅
3. Immutability, types, prevent object from writing
const object
ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°Π·Π½Π°ΡΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ΅ΠΌΡ-ΡΠΎ Π΄ΡΡΠ³ΠΎΠΌΡ, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ let ΠΈ var, Π½ΠΎ Π²Ρ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²Π°, ΡΠ΄Π°Π»ΠΈΡΡ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ.
Object.preventExtensions(myObject)
ΠΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΡΡ ΡΠ²ΠΎΠΉΡΡΠ² ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΡΠ²ΠΎΠΉΡΡΠ² ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ.
Object.seal(myObject)
ΠΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΡΡ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΡΠ²ΠΎΠΉΡΡΠ² Π² ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈ ΠΈΠ· ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΡΠ²ΠΎΠΉΡΡΠ² ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ.
Object.freeze(myObject)
ΠΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. Π‘ Π·Π°ΠΌΠΎΡΠ°ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ Π²Ρ ΡΠ²Π΅ΡΠ΅Π½Ρ, ΡΡΠΎ ΠΎΠ½ Π½ΠΈΠ³Π΄Π΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ Π² Π²Π°ΡΠ΅ΠΌ ΠΊΠΎΠ΄Π΅.
Useful link:
4. Property descriptors
ΠΠ΅ΡΠΎΠ΄ Object.defineProperty - ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ (ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ, ΡΠ΄Π°Π»ΡΡΡ ΠΈ Π΄Ρ.)
var o = {};
o.a = 1;
// ΠΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎ Π·Π°ΠΏΠΈΡΠΈ:
Object.defineProperty(o, 'a', {
value: 1,
writable: true,
configurable: true,
enumerable: true
});
// Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ,
Object.defineProperty(o, 'a', { value: 1 });
// ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎ Π·Π°ΠΏΠΈΡΠΈ:
Object.defineProperty(o, 'a', {
value: 1,
writable: false,
configurable: false,
enumerable: false
});
Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ
Object.defineProperty(ΠΎΠ±ΡΠ΅ΠΊΡ, 'ΠΈΠΌΡ ΡΠ²ΠΎΠΉΡΡΠ²Π°', Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ);
ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ - ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°. Π Π½Π΅ΠΌ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° (Π² ΡΠΊΠΎΠ±ΠΊΠ°Ρ ΡΠΊΠ°Π·Π°Π½Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ):
value //Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° (undefined)
writable //Π΅ΡΠ»ΠΈ true - ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ (false)
configurable // Π΅ΡΠ»ΠΈ true, ΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΡΡΡ (false)
enumerable //Π΅ΡΠ»ΠΈ true, ΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Π²ΠΈΠ΄Π½ΠΎ Π² ΡΠΈΠΊΠ»Π΅ for..in (false)
get //Π€ΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° (undefined)
set //Π€ΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° (undefined);
ΠΡΠ»ΠΈ ΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΠΌ ΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ Π·Π°ΠΏΡΠ΅ΡΠ΅Π½Π½ΠΎΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ writable = false, ΡΠΎ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ (Π° Π² ΡΡΡΠΎΠ³ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ (ΠΏΡΠΈ ΡΠΊΠ°Π·Π°Π½ΠΈΠΈ 'use strict') - Π±ΡΠ΄Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ°). Π’Π°ΠΊΠΆΠ΅ Π·Π°ΠΏΡΠ΅ΡΠ΅Π½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ value/writeble Π΅ΡΠ»ΠΈ ΡΠΊΠ°Π·Π°Π½Ρ get/set.
ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° β ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΡΠΉ JavaScript-ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠΉ Π°ΡΡΠΈΠ±ΡΡΡ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°.
ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ ΡΠ²ΠΎΠΉΡΡΠ², ΠΏΡΠΈΡΡΡΡΡΠ²ΡΡΡΠΈΠ΅ Π² ΠΎΠ±ΡΠ΅ΠΊΡΠ°Ρ , Π±ΡΠ²Π°ΡΡ Π΄Π²ΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΠΈΠΏΠΎΠ²: Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ Π΄Π°Π½Π½ΡΡ ΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ Π΄ΠΎΡΡΡΠΏΠ°.
ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄Π°Π½Π½ΡΡ - ΡΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ, ΠΈΠΌΠ΅ΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ (Π° ΠΌΠΎΠΆΠ΅Ρ ΠΈ Π½Π΅ Π±ΡΡΡ) Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΠΌ.
ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄ΠΎΡΡΡΠΏΠ° - ΡΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ, ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌΠΎΠ΅ ΠΏΠ°ΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΉ - Π³Π΅ΡΡΠ΅ΡΠΎΠΌ ΠΈ ΡΠ΅ΡΡΠ΅ΡΠΎΠΌ.
ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΌ-ΡΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΡΠΈΡ Π΄Π²ΡΡ ΡΠΈΠΏΠΎΠ². ΠΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΠ±ΠΎΠΈΠΌΠΈ.
Π Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄Π°Π½Π½ΡΡ , ΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄ΠΎΡΡΡΠΏΠ° ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ. Π‘Π²ΠΎΠΉΡΡΠ²Π° configurable ΠΈ enumerable ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ±ΡΠΈΠΌΠΈ Π΄Π»Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° Π΄Π°Π½Π½ΡΡ ΠΈ Π΄Π»Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° Π΄ΠΎΡΡΡΠΏΠ°, value ΠΈ writable ΠΎΡΠ½ΠΎΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ Π΄Π°Π½Π½ΡΡ , Π° get ΠΈ set - ΠΊ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ Π΄ΠΎΡΡΡΠΏΠ°. ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ ΠΎΠ±ΠΎΠΈΠΌ ΡΠΈΠΏΠ°ΠΌ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.
Useful links:
5. Cookie, Storage
6. Constructor
Π€ΡΠ½ΠΊΡΠΈΠΈ-ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ. ΠΠΎ Π΅ΡΡΡ Π΄Π²Π° ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΡ:
ΠΠΌΡ ΡΡΠ½ΠΊΡΠΈΠΈ-ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ Ρ Π±ΠΎΠ»ΡΡΠΎΠΉ Π±ΡΠΊΠ²Ρ.
Π€ΡΠ½ΠΊΡΠΈΡ-ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°
"new"
.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
function User(name) {
this.name = name;
this.isAdmin = false;
}
let user = new User("ΠΠ°ΡΡ");
alert(user.name); // ΠΠ°ΡΡ
alert(user.isAdmin); // false
ΠΠΎΠ³Π΄Π° ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ new User(...)
, ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
Π‘ΠΎΠ·Π΄Π°ΡΡΡΡ Π½ΠΎΠ²ΡΠΉ ΠΏΡΡΡΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΈ ΠΎΠ½ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ
this
.ΠΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΊΠΎΠ΄ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ±ΡΡΠ½ΠΎ ΠΎΠ½ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅Ρ
this
, Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΡΠ΄Π° Π½ΠΎΠ²ΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°.ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
this
.
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΏΠΎΡ ΠΎΠΆΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².
7. Prototype
ΠΡΠ΅, ΠΊΡΠΎΠΌΠ΅ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠ² - ΠΎΠ±ΡΠ΅ΠΊΡΡ, Ρ.Π΅. Π²ΡΠ΅ ΠΊΡΠΎΠΌΠ΅:
undefined
null
boolean
number
string
Symbol
ΠΠ°ΠΆΠ΄ΡΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠ²-Π²ΠΎ prototype. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠΌ, ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΡΡΠ»ΠΊΡ Π½Π° ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ prototype ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°. ΠΡΠ° ΡΡΡΠ»ΠΊΠ° Ρ ΡΠ°Π½ΠΈΡΡΡ Π² ΡΠ²ΠΎΠΉΡΡΠ²Π΅ __proto__. obj.toString() - ΡΡΡΠΎΠΊΠ°, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠ°Ρ ΠΎΠ±ΡΠ΅ΠΊΡ.
Promise / Async / Ajax / Fetch
Callback => Promise => Async Await
AJAX(XMLHTTPRequest) => Fetch
Promise β ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ²ΠΎΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅. ΠΠ½Π°ΡΠ°Π»Π΅ pending
(Β«ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅Β»), Π·Π°ΡΠ΅ΠΌ β ΠΎΠ΄Π½ΠΎ ΠΈΠ·: fulfilled
(Β«Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΎ ΡΡΠΏΠ΅ΡΠ½ΠΎΒ») ΠΈΠ»ΠΈ rejected
(Β«Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΎ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉΒ»). ΠΡΠΎΠΌΠ΅ status ΠΈΠΌΠ΅Π΅Ρ ΠΈ value.
ΠΡΠΈ ΠΊΠΎΠ»Π»Π±ΡΠΊΠ°Ρ
Π±ΡΠ»Π° ΠΎΠ³ΡΠΎΠΌΠ½Π°Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΡΡ
Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΈ ΠΏΠΈΡΠ°ΠΌΠΈΠ΄ ΠΈΠ· })
Π² ΠΊΠΎΠ½ΡΠ΅. ΠΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ ΡΠ»ΡΡΠ°ΠΈ ΠΏΡΠΈΠ½ΡΡΠΎ Π½Π°Π·ΡΠ²Π°ΡΡ Callback Hell ΠΈΠ»ΠΈ Pyramid of Doom. ΠΠΎΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ:
Π’Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ ΡΠ»ΠΎΠΆΠ½ΠΎ ΡΠΈΡΠ°ΡΡ.
Π ΡΠ°ΠΊΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΡΠ»ΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΠΎΡ ΡΠ°Π½ΡΡΡ Π΅Π³ΠΎ Β«ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΒ».
ΠΠ»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π² JavaScript Π±ΡΠ»ΠΈ ΠΏΡΠΈΠ΄ΡΠΌΠ°Π½Ρ ΠΏΡΠΎΠΌΠΈΡΡ (Π°Π½Π³Π». promises). Π’Π΅ΠΏΠ΅ΡΡ Π³Π»ΡΠ±ΠΎΠΊΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡΡ ΠΊΠΎΠ»Π»Π±ΡΠΊΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΠΊΠ»ΡΡΠ΅Π²ΡΠΌ ΡΠ»ΠΎΠ²ΠΎΠΌ then
:
queryDatabase({ username: 'Arfat'})
.then((user) => {
const image_url = user.profile_img_url;
return getImageByURL('someServer.com/q=${image_url}')
.then(image => transformImage(image))
.then(() => sendEmail(user.email))
})
.then(() => logTaskInFile('...'))
.catch(() => handleErrors()) // ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ
ΠΠΎΠ΄ ΡΡΠ°Π» ΡΠΈΡΠ°ΡΡΡΡ ΡΠ²Π΅ΡΡ Ρ Π²Π½ΠΈΠ·, Π° Π½Π΅ ΡΠ»Π΅Π²Π° Π½Π°ΠΏΡΠ°Π²ΠΎ, ΠΊΠ°ΠΊ ΡΡΠΎ Π±ΡΠ»ΠΎ Π² ΡΠ»ΡΡΠ°Π΅ Ρ ΠΎΠ±ΡΠ°ΡΠ½ΡΠΌΠΈ Π²ΡΠ·ΠΎΠ²Π°ΠΌΠΈ. ΠΡΠΎ ΠΏΠ»ΡΡ ΠΊ ΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΈ Ρ ΠΏΡΠΎΠΌΠΈΡΠΎΠ² Π΅ΡΡΡ ΡΠ²ΠΎΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ:
ΠΡΡ Π΅ΡΡ Π½ΡΠΆΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΊΡΡΠ΅ΠΉ
.then
.ΠΠΌΠ΅ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ
try/catch
Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ.catch
Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²ΡΠ΅Ρ ΠΎΡΠΈΠ±ΠΎΠΊ.Π Π°Π±ΠΎΡΠ° Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΡΠΎΠΌΠΈΡΠ°ΠΌΠΈ Π² ΡΠΈΠΊΠ»Π΅ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΠΈΠ½ΡΡΠΈΡΠΈΠ²Π½ΠΎ ΠΏΠΎΠ½ΡΡΠ½Π° ΠΈ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΡΠ»ΠΎΠΆΠ½Π°.
Async/Await
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ async-ΡΡΠ½ΠΊΡΠΈΠΉ Π² ES2017 (ES8) ΡΠ΄Π΅Π»Π°Π»ΠΎ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΡΠΎΠΌΠΈΡΠ°ΠΌΠΈ Π»Π΅Π³ΡΠ΅.
ΠΠ°ΠΆΠ½ΠΎ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ async-ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΠΎΠ²Π΅ΡΡ ΠΏΡΠΎΠΌΠΈΡΠΎΠ².
ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈΠ°Π»ΡΠ½ΠΎ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡΠΌΠΈ.
Async-ΡΡΠ½ΠΊΡΠΈΠΈ Π±ΡΠ»ΠΈ Π·Π°Π΄ΡΠΌΠ°Π½Ρ ΠΊΠ°ΠΊ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° ΠΊΠΎΠ΄Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅ΠΌΡ ΠΏΡΠΎΠΌΠΈΡΡ.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ async/await, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΏΠΎΡΠ΅ΠΊ ΠΏΡΠΎΠΌΠΈΡΠΎΠ².
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ async-ΡΡΠ½ΠΊΡΠΈΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π±ΠΎΡΡ Ρ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π² ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠΌ ΡΡΠΈΠ»Π΅.
Π¦Π΅Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΉ async/await ΡΠΏΡΠΎΡΡΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ promises ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎ ΠΈ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π½Π°Π΄ Π³ΡΡΠΏΠΏΠΎΠΉ Promises
.
Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π΄Π²ΡΡ
ΠΊΠ»ΡΡΠ΅Π²ΡΡ
ΡΠ»ΠΎΠ²: async
ΠΈ await
. ΠΠ΅ΡΠ²ΠΎΠ΅ Π΄Π΅Π»Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎΠΉ. ΠΠΌΠ΅Π½Π½ΠΎ Π² ΡΠ°ΠΊΠΈΡ
ΡΡΠ½ΠΊΡΠΈΡΡ
ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ await
. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ await
Π² Π»ΡΠ±ΠΎΠΌ Π΄ΡΡΠ³ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΡΠ·ΠΎΠ²Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ.
// Π ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ
async function myFn() {
// await ...
}
// Π ΡΡΡΠ΅Π»ΠΎΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ
const myFn = async () => {
// await ...
}
function myFn() {
// await fn(); (ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠ°, Ρ. ΠΊ. Π½Π΅Ρ async)
}
Async-ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΡ ΠΎΠΆΠΈ Π½Π° ΠΎΠ±ΡΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² JavaScript, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π²Π΅ΡΠ΅ΠΉ:
Async-ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠ΅Π³Π΄Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΏΡΠΎΠΌΠΈΡΡ
async function fn() {
return 'hello';
}
fn().then(console.log)
// hello
Π€ΡΠ½ΠΊΡΠΈΡ fn
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΡΠΎΠΊΡ 'hello'
. Π’. ΠΊ. ΡΡΠΎ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ ΠΎΠ±ΡΡΡΡΠ²Π°Π΅ΡΡΡ Π² ΠΏΡΠΎΠΌΠΈΡ (Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°).
ΠΠΎΠ΄ Π²ΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°ΡΡ ΠΈ Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ async
:
function fn() {
return Promise.resolve('hello');
}
fn().then(console.log);
// hello
Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π²ΠΌΠ΅ΡΡΠΎ async
, ΠΊΠΎΠ΄ Π²ΡΡΡΠ½ΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΡΠΎΠΌΠΈΡ.
Π§ΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΠΊΠΎΠ³Π΄Π° Π²Π½ΡΡΡΠΈ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΊΠ°ΠΊΠ°Ρ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΎΡΠΈΠ±ΠΊΠ°?
async function foo() {
throw Error('bar');
}
foo().catch(console.log);
ΠΡΠ»ΠΈ ΠΎΡΠΈΠ±ΠΊΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π°, foo()
Π²Π΅ΡΠ½ΡΡ ΠΏΡΠΎΠΌΠΈΡ Ρ ΡΠ΅Π΄ΠΆΠ΅ΠΊΡΠΎΠΌ. Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΠΌΠ΅ΡΡΠΎ Promise.resolve
Π²Π΅ΡΠ½ΡΡΡΡ Promise.reject
, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΠΎΡΠΈΠ±ΠΊΡ.
Π€ΡΠ½ΠΊΡΠΈΡ async ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ await
, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ async ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΠΎΡΠ²Π΅ΡΠ° ΠΎΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Promise
, Π·Π°ΡΠ΅ΠΌ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ async
ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ await
Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π² Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΡ
ΡΡΠ½ΠΊΡΠΈΡΡ
.
ΠΡΠΈΠΌΠ΅Ρ 1
ΠΡΠ»ΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΠΌΠΈΡΠΎΠΌ, ΡΠΎ async-ΡΡΠ½ΠΊΡΠΈΡ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° Π΄ΠΎ ΡΠ΅Ρ
ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΏΡΠΎΠΌΠΈΡ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ. ΠΡΠ»ΠΈ ΠΆΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΠΌΠΈΡΠΎΠΌ, ΡΠΎ ΠΎΠ½ΠΎ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΡΠ΅ΡΡΡ Π² ΠΏΡΠΎΠΌΠΈΡ ΡΠ΅ΡΠ΅Π· Promise.resolve
ΠΈ ΠΏΠΎΡΠΎΠΌ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ.
// Π€ΡΠ½ΠΊΡΠΈΡ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ
// Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π°
const delayAndGetRandom = (ms) => {
return new Promise(resolve => setTimeout(
() => {
const val = Math.trunc(Math.random() * 100);
resolve(val);
}, ms
));
};
async function fn() {
const a = await 9;
const b = await delayAndGetRandom(1000);
const c = await 5;
await delayAndGetRandom(1000);
return a + b * c;
}
// ΠΡΠ·ΠΎΠ² fn
fn().then(console.log);
ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ fn
ΡΡΠ½ΠΊΡΠΈΡ?
ΠΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π°
fn
ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠ΅ΡΠ²Π°Ρ ΡΡΡΠΎΠΊΠ° ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΡΠ΅ΡΡΡ ΠΈΠ·const a = await 9;
Π²const a = await Promise.resolve(9);
.ΠΠΎΡΠ»Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
await
, Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ, ΠΏΠΎΠΊΠ°a
Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡ ΡΠ²ΠΎΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ 9).delayAndGetRandom(1000)
ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅fn
ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ ΡΠ°ΠΌΠ° (ΠΏΠΎΡΠ»Π΅ 1 ΡΠ΅ΠΊΡΠ½Π΄Ρ). ΠΡΠΎ, ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°ΡΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΎΠΉfn
ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° 1 ΡΠ΅ΠΊΡΠ½Π΄Ρ.Π’Π°ΠΊΠΆΠ΅
delayAndGetRandom(1000)
ΡΠ΅ΡΠ΅Π·resolve
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉb
.Π‘Π»ΡΡΠ°ΠΉ Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ
c
ΠΈΠ΄Π΅Π½ΡΠΈΡΠ΅Π½ ΡΠ»ΡΡΠ°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉa
. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΎΠΏΡΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠ°ΡΠ·Π° Π½Π° 1 ΡΠ΅ΠΊΡΠ½Π΄Ρ, Π½ΠΎ ΡΠ΅ΠΏΠ΅ΡΡdelayAndGetRandom(1000)
Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ, Ρ. ΠΊ. ΡΡΠΎΠ³ΠΎ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ.ΠΠΎΠ΄ ΠΊΠΎΠ½Π΅Ρ ΡΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠΈΡΠ°ΡΡΡΡ ΠΏΠΎ ΡΠΎΡΠΌΡΠ»Π΅
a + b * c
. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ ΠΎΠ±ΡΡΡΡΠ²Π°Π΅ΡΡΡ Π² ΠΏΡΠΎΠΌΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡPromise.resolve
ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ.
ΠΡΠΈΠΌΠ΅Ρ 2
function resolveAfter2Seconds(x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x);
}, 2000);
});
}
async function add1(x) {
const a = await resolveAfter2Seconds(20);
const b = await resolveAfter2Seconds(30);
return x + a + b;
}
add1(10).then(v => {
console.log(v); // prints 60 after 4 seconds.
});
async function add2(x) {
const a = resolveAfter2Seconds(20);
const b = resolveAfter2Seconds(30);
return x + await a + await b;
}
add2(10).then(v => {
console.log(v); // prints 60 after 2 seconds.
});
ΠΠ΅ ΠΏΡΡΠ°ΠΉΡΠ΅ await ΠΈ Promise.all
Π€ΡΠ½ΠΊΡΠΈΡ add1
ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π½Π° 2 ΡΠ΅ΠΊΡΠ½Π΄Ρ Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ await
ΠΈ Π΅ΡΠ΅ Π½Π° 2 Π΄Π»Ρ Π²ΡΠΎΡΠΎΠ³ΠΎ. ΠΡΠΎΡΠΎΠΉ ΡΠ°ΠΉΠΌΠ΅Ρ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ. Π ΡΡΠ½ΠΊΡΠΈΠΈ add2
ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΎΠ±Π° ΠΈ ΠΎΠ±Π° ΠΆΠ΅ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ await
. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ add2
Π·Π°Π²Π΅ΡΡΠΈΡΡΡ ΡΠΊΠΎΡΠ΅Π΅ ΡΠ΅ΡΠ΅Π· Π΄Π²Π΅, ΡΠ΅ΠΌ ΡΠ΅ΡΠ΅Π· ΡΠ΅ΡΡΡΠ΅ ΡΠ΅ΠΊΡΠ½Π΄Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ°ΠΉΠΌΠ΅ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ. ΠΠ΄Π½Π°ΠΊΠΎ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ ΠΎΠ½ΠΈ Π²ΡΠ΅ ΠΆΠ΅ Π½Π΅ ΠΏΠ°ΡΠ°Π»Π΅Π»Π»ΡΠ½ΠΎ, Π° Π΄ΡΡΠ³ Π·Π° Π΄ΡΡΠ³ΠΎΠΌ - ΡΠ°ΠΊΠ°Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ Π½Π΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Promise.all
. ΠΡΠ»ΠΈ Π΄Π²Π° ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Promise Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ°Π·ΡΠ΅ΡΠ°ΡΡΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ, ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Promise.all
.
ΠΡΠΈΠΌΠ΅Ρ 3 (Ρ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ)
ΠΠΎΠ³Π΄Π° ΡΡΠ½ΠΊΡΠΈΡ async
Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
async
Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅async function throwsValue() {
throw new Error('oops');
}
throwsValue()
.then((resolve) => {
console.log("resolve:" + resolve);
},
(reject) => {
console.log("reject:" + reject);
});
//prints "reject:Error: oops"
//or
throwsValue()
.then((resolve) => {
console.log("resolve:" + resolve);
})
.catch((reject) => {
console.log("reject:" + reject);
});
//prints "reject:Error: oops"
Useful links:
AJAX
ΡΡΠΎ ΠΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ JavaScript ΠΈ XML. ΠΡΠΎ Π½Π°Π±ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π²Π΅Π±-ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ β ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π»ΡΠ±ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅. ΠΠΎΠ΄ AJAX ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΡΡΡ Π½Π΅ ΠΎΠ΄Π½Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ, ΠΈ ΠΎΠ½Π° Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½ΠΎΠ²ΠΎΠΉ. ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΡΠΎ Π³ΡΡΠΏΠΏΠ° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ (HTML, CSS, Javascript, XML, ΠΈ Ρ.Π΄.), ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π²ΠΌΠ΅ΡΡΠ΅ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
AJAX Π·Π°ΠΏΡΠΎΡ, - ΡΡΠΎ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΡ Π·Π°Π΄Π°Ρ, Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ Β«Π·Π°ΠΏΡΠΎΡ-ΠΎΡΠ²Π΅ΡΒ».
Π ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π»Π΅ΠΆΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° XMLHttpRequest
, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠΎ ΡΠΊΡΠΈΠΏΡΠ°ΠΌΠΈ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΠ±ΡΠ΅ΠΊΡ ΠΌΠΎΠΆΠ΅Ρ ΠΊΠ°ΠΊ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ, ΡΠ°ΠΊ ΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΡΠΎΡΠΌΠ°ΡΠ°Ρ
Π²ΠΊΠ»ΡΡΠ°Ρ XML, HTML ΠΈ Π΄Π°ΠΆΠ΅ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ. Π‘Π°ΠΌΠΎΠ΅ ΠΏΡΠΈΠ²Π»Π΅ΠΊΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π² Ajax β ΡΡΠΎ Π΅Π³ΠΎ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΉ ΠΏΡΠΈΠ½ΡΠΈΠΏ ΡΠ°Π±ΠΎΡΡ. Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠΉ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΡΡΠ°Π½ΠΈΡΡ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ ΡΠ°ΡΡΠΈΡΠ½ΠΎ, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
XMLHttpRequest
β ΡΡΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ Π² Π±ΡΠ°ΡΠ·Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄Π΅Π»Π°ΡΡ HTTP-Π·Π°ΠΏΡΠΎΡΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ Π±Π΅Π· ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΡΡΠ°Π½ΠΈΡΡ. ΠΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ Π½Π°Π±ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Π² ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°Ρ
HTTP ΠΈ HTTPS.
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ ΡΠ»ΠΎΠ²Π° Β«XMLΒ» Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ, XMLHttpRequest ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π»ΡΠ±ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ, Π° Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Ρ XML. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Π³ΡΡΠΆΠ°ΡΡ/ΡΠΊΠ°ΡΠΈΠ²Π°ΡΡ ΡΠ°ΠΉΠ»Ρ, ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ΅ΡΡ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅.
ΠΠ° ΡΠ΅Π³ΠΎΠ΄Π½ΡΡΠ½ΠΈΠΉ Π΄Π΅Π½Ρ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ XMLHttpRequest
, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π΄ΡΡΠ³ΠΎΠΉ, Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ fetch
.
Π ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π²Π΅Π±-ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ XMLHttpRequest
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠΎ ΡΡΡΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ:
ΠΠΎ ΠΈΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ: ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅Π³ΠΎ
XMLHttpRequest
, ΠΊΠΎΡΠΎΡΡΠΉ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ.ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΡΠ°ΡΡΠ΅ Π±ΡΠ°ΡΠ·Π΅ΡΡ ΠΈ Π½Π΅ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ»ΠΈΡΠΈΠ»Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎΠ±Ρ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ΄Π°).
ΠΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡ Π² ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΡ
fetch
ΠΏΠΎΠΊΠ° ΡΡΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ, ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ, ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ΅ΡΡΠ° ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ.
XMLHttpRequest ΠΈΠΌΠ΅Π΅Ρ Π΄Π²Π° ΡΠ΅ΠΆΠΈΠΌΠ° ΡΠ°Π±ΠΎΡΡ: ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ ΠΈ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½.
Π§ΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ Π·Π°ΠΏΡΠΎΡ, Π½ΡΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡΠΈ ΡΠ°Π³Π°:
Π‘ΠΎΠ·Π΄Π°ΡΡ
XMLHttpRequest
.let xhr = new XMLHttpRequest(); // Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° Π½Π΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²
xhr β ΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄Π΅Ρ Ρ ΡΠ°Π½ΠΈΡΡΡ, - ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° XMLHttpRequest, ΠΎΠ±ΡΠ΅ΠΊΡ Ρ Π½Π°Π±ΠΎΡΠΎΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ².
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ.
xhr.open(method, URL, [async, user, password])
ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΎΠ±ΡΡΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅
new XMLHttpRequest
. Π Π½Π΅Π³ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π·Π°ΠΏΡΠΎΡΠ°:method
β HTTP-ΠΌΠ΅ΡΠΎΠ΄. ΠΠ±ΡΡΠ½ΠΎ ΡΡΠΎ"GET"
ΠΈΠ»ΠΈ"POST"
.URL
β URL, ΠΊΡΠ΄Π° ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π·Π°ΠΏΡΠΎΡ: ΡΡΡΠΎΠΊΠ°, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ URL.async
β Π΅ΡΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΡfalse
, ΡΠΎΠ³Π΄Π° Π·Π°ΠΏΡΠΎΡ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ, ΡΡΠΎ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅.user
,password
β Π»ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°ΡΠΎΠ»Ρ Π΄Π»Ρ Π±Π°Π·ΠΎΠ²ΠΎΠΉ HTTP-Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ (Π΅ΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ).
ΠΠ°ΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ Π²ΡΠ·ΠΎΠ²
open
, Π²ΠΎΠΏΡΠ΅ΠΊΠΈ ΡΠ²ΠΎΠ΅ΠΌΡ Π½Π°Π·Π²Π°Π½ΠΈΡ, Π½Π΅ ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅. ΠΠ½ Π»ΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡ, Π½ΠΎ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΡΡΡΠ»Π°Π΅ΡΡΡ Π·Π°ΠΏΡΠΎΡ ΡΠΎΠ»ΡΠΊΠΎ Π»ΠΈΡΡ ΠΏΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π°send
.ΠΠΎΡΠ»Π°ΡΡ Π·Π°ΠΏΡΠΎΡ.
xhr.send([body])
ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΡΡΡΠ»Π°Π΅Ρ Π·Π°ΠΏΡΠΎΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ. ΠΠ΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ
body
ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ΅Π»ΠΎ Π·Π°ΠΏΡΠΎΡΠ°.Π‘Π»ΡΡΠ°ΡΡ ΡΠΎΠ±ΡΡΠΈΡ Π½Π°
xhr
, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΡΠ²Π΅Ρ.Π’ΡΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΠΎΠ±ΡΡΠΈΡ:
load
β ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΎΡΠ²Π΅Ρ, Π²ΠΊΠ»ΡΡΠ°Ρ ΠΎΡΠ²Π΅ΡΡ Ρ HTTP-ΠΎΡΠΈΠ±ΠΊΠΎΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ 404.error
β ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΏΡΠΎΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΡΠΉ URL.progress
β ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΎΡΠ²Π΅ΡΠ°, ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ ΠΎ ΠΏΡΠΎΠ³ΡΠ΅ΡΡΠ΅.
ΠΠΎΠ»Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ. ΠΠΎΠ΄ Π½ΠΈΠΆΠ΅ Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ /article/xmlhttprequest/example/load
Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈ ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ ΠΎ ΠΏΡΠΎΠ³ΡΠ΅ΡΡΠ΅:
// 1. Π‘ΠΎΠ·Π΄Π°ΡΠΌ Π½ΠΎΠ²ΡΠΉ XMLHttpRequest-ΠΎΠ±ΡΠ΅ΠΊΡ
let xhr = new XMLHttpRequest();
// 2. ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ: GET-Π·Π°ΠΏΡΠΎΡ ΠΏΠΎ URL /article/.../load
xhr.open('GET', '/article/xmlhttprequest/example/load');
// 3. ΠΡΡΡΠ»Π°Π΅ΠΌ Π·Π°ΠΏΡΠΎΡ
xhr.send();
// 4. ΠΡΠΎΡ ΠΊΠΎΠ΄ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΎΡΠ²Π΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°
xhr.onload = function() {
if (xhr.status != 200) { // Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ HTTP-ΡΡΠ°ΡΡΡ ΠΎΡΠ²Π΅ΡΠ°, Π΅ΡΠ»ΠΈ ΡΡΠ°ΡΡΡ Π½Π΅ 200, ΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ°
alert(`ΠΡΠΈΠ±ΠΊΠ° ${xhr.status}: ${xhr.statusText}`); // ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, 404: Not Found
} else { // Π΅ΡΠ»ΠΈ Π²ΡΡ ΠΏΡΠΎΡΠ»ΠΎ Π³Π»Π°Π΄ΠΊΠΎ, Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ
alert(`ΠΠΎΡΠΎΠ²ΠΎ, ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ${xhr.response.length} Π±Π°ΠΉΡ`); // response -- ΡΡΠΎ ΠΎΡΠ²Π΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°
}
};
xhr.onprogress = function(event) {
if (event.lengthComputable) {
alert(`ΠΠΎΠ»ΡΡΠ΅Π½ΠΎ ${event.loaded} ΠΈΠ· ${event.total} Π±Π°ΠΉΡ`);
} else {
alert(`ΠΠΎΠ»ΡΡΠ΅Π½ΠΎ ${event.loaded} Π±Π°ΠΉΡ`); // Π΅ΡΠ»ΠΈ Π² ΠΎΡΠ²Π΅ΡΠ΅ Π½Π΅Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Content-Length
}
};
xhr.onerror = function() {
alert("ΠΠ°ΠΏΡΠΎΡ Π½Π΅ ΡΠ΄Π°Π»ΡΡ");
};
ΠΠ°ΠΆΠ΄ΡΠΉ ΠΎΡΠ²Π΅Ρ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ° Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π·Π°ΠΏΡΠΎΡΠ° Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΡ
ΡΠ²ΠΎΠΉΡΡΠ²Π°Ρ
xhr
:status
ΠΠΎΠ΄ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ HTTP (ΡΠΈΡΠ»ΠΎ): 200
, 404
, 403
ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ 0
Π² ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΠΎΡΠΈΠ±ΠΊΠ° Π½Π΅ ΡΠ²ΡΠ·Π°Π½Π° Ρ HTTP.
statusText
Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΎΡΠ²Π΅ΡΠ° HTTP (ΡΡΡΠΎΠΊΠ°): ΠΎΠ±ΡΡΠ½ΠΎ OK
Π΄Π»Ρ 200
, Not Found
Π΄Π»Ρ 404
, Forbidden
Π΄Π»Ρ 403
, ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅.
response
(Π² ΡΡΠ°ΡΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΡΡΠ΅ΡΠ°ΡΡΡΡ ΠΊΠ°ΠΊ responseText
)Π’Π΅Π»ΠΎ ΠΎΡΠ²Π΅ΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°, Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈΠ΄ΡΡ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ° Π² Π²ΠΈΠ΄Π΅ ΡΡΡΠΎΠΊΠΈ
Π’ΠΈΠΏ ΠΎΡΠ²Π΅ΡΠ°:
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ xhr.responseType
, ΡΡΠΎΠ±Ρ ΡΠΊΠ°Π·Π°ΡΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΉ ΡΠΈΠΏ ΠΎΡΠ²Π΅ΡΠ°:
""
(ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ) β ΡΡΡΠΎΠΊΠ°,"text"
β ΡΡΡΠΎΠΊΠ°,"arraybuffer"
βArrayBuffer
(Π΄Π»Ρ Π±ΠΈΠ½Π°ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ , ΡΠΌΠΎΡΡΠΈΡΠ΅ Π² ArrayBuffer, Π±ΠΈΠ½Π°ΡΠ½ΡΠ΅ ΠΌΠ°ΡΡΠΈΠ²Ρ),"blob"
βBlob
(Π΄Π»Ρ Π±ΠΈΠ½Π°ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ , ΡΠΌΠΎΡΡΠΈΡΠ΅ Π² Blob),"document"
β XML-Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ (ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ XPath ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ XML-ΠΌΠ΅ΡΠΎΠ΄Ρ),"json"
β JSON (ΠΏΠ°ΡΡΠΈΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ).
Π ΠΏΡΠΈΠΌΠ΅ΡΡ, Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΎΡΠ²Π΅Ρ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ JSON:
let xhr = new XMLHttpRequest();
xhr.open('GET', '/article/xmlhttprequest/example/json');
xhr.responseType = 'json';
xhr.send();
// ΡΠ΅Π»ΠΎ ΠΎΡΠ²Π΅ΡΠ° {"ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅": "ΠΡΠΈΠ²Π΅Ρ, ΠΌΠΈΡ!"}
xhr.onload = function() {
let responseObj = xhr.response;
alert(responseObj.message); // ΠΡΠΈΠ²Π΅Ρ, ΠΌΠΈΡ!
};
Π‘ΠΎΡΡΠΎΡΠ½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ°:
Π£ XMLHttpRequest
Π΅ΡΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ(ΡΡΠ°ΡΡΡΡ HTTP-Π·Π°ΠΏΡΠΎΡΠ°), ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠ΅Π½ΡΡΡΡΡ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ°. Π’Π΅ΠΊΡΡΠ΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π² ΡΠ²ΠΎΠΉΡΡΠ²Π΅ xhr.readyState
.
Π‘ΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ, ΡΠΊΠ°Π·Π°Π½Π½ΡΡ Π² ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ:
UNSENT = 0; // ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅
OPENED = 1; // Π²ΡΠ·Π²Π°Π½ ΠΌΠ΅ΡΠΎΠ΄ open
HEADERS_RECEIVED = 2; // ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΎΡΠ²Π΅ΡΠ°
LOADING = 3; // ΠΎΡΠ²Π΅Ρ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ (Π΄Π°Π½Π½ΡΠ΅ ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ)
DONE = 4; // Π·Π°ΠΏΡΠΎΡ Π·Π°Π²Π΅ΡΡΡΠ½
Π‘ΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° XMLHttpRequest
ΠΌΠ΅Π½ΡΡΡΡΡ Π² ΡΠ°ΠΊΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅: 0
β 1
β 2
β 3
β β¦ β 3
β 4
. Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ 3
ΠΏΠΎΠ²ΡΠΎΡΡΠ΅ΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΡΠ΅Π½Π° ΡΠ°ΡΡΡ Π΄Π°Π½Π½ΡΡ
.
onreadystatechange β ΡΡΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ»ΡΡΠΈΡΡΡ ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ ΠΏΡΠΈΠ΄Π΅Ρ ΠΎΡΠ²Π΅Ρ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°.
ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π·Π°ΠΏΡΠΎΡΠ° Π³Π΅Π½Π΅ΡΠΈΡΡΡΡ ΡΠΎΠ±ΡΡΠΈΠ΅ readystatechange
:
xhr.onreadystatechange = function() {
if (xhr.readyState == 3) {
// Π·Π°Π³ΡΡΠ·ΠΊΠ°
}
if (xhr.readyState == 4) {
// Π·Π°ΠΏΡΠΎΡ Π·Π°Π²Π΅ΡΡΡΠ½
}
};
COMET
COMET β ΠΎΠ±ΡΠΈΠΉ ΡΠ΅ΡΠΌΠΈΠ½, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠΉ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΈΠ²Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ°.
ΠΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ AJAX β ΡΡΠΎ Β«ΠΎΡΠΏΡΠ°Π²ΠΈΠ» Π·Π°ΠΏΡΠΎΡ β ΠΏΠΎΠ»ΡΡΠΈΠ» ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΒ», Π° COMET β ΡΡΠΎ Β«Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΡΠΉ ΠΊΠ°Π½Π°Π», ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ Π΄Π°Π½Π½ΡΠ΅Β».
ΠΡΠΈΠΌΠ΅ΡΡ COMET-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ:
Π§Π°Ρ β ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ ΡΠΈΠ΄ΠΈΡ ΠΈ ΡΠΌΠΎΡΡΠΈΡ, ΡΡΠΎ ΠΏΠΈΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅. ΠΡΠΈ ΡΡΠΎΠΌ Π½ΠΎΠ²ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ Β«ΡΠ°ΠΌΠΈ ΠΏΠΎ ΡΠ΅Π±Π΅Β», ΠΎΠ½ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°ΠΆΠΈΠΌΠ°ΡΡ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ Π΄Π»Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΎΠΊΠ½Π° ΡΠ°ΡΠ°.
ΠΡΠΊΡΠΈΠΎΠ½ β ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ ΡΠΌΠΎΡΡΠΈΡ Π½Π° ΡΠΊΡΠ°Π½ ΠΈ Π²ΠΈΠ΄ΠΈΡ, ΠΊΠ°ΠΊ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅ΠΊΡΡΠ°Ρ ΡΡΠ°Π²ΠΊΠ° Π·Π° ΡΠΎΠ²Π°Ρ.
ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ β ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ, Π΄ΡΡΠ³ΠΈΠ΅ Π²ΠΈΠ΄ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± ΡΡΠΎΠΌ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠ΅ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° ΡΠ΅Π΄Π°ΠΊΡΠΎΡΡ Π²ΠΈΠ΄ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΄ΡΡΠ³ Π΄ΡΡΠ³Π°.
COMET-ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ΅ Π±Π΅Π· ΡΡΠ°ΡΡΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
ΠΠ° ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ COMET ΡΠ΄ΠΎΠ±Π½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Π²ΠΎ Π²ΡΠ΅Ρ Π±ΡΠ°ΡΠ·Π΅ΡΠ°Ρ .
Fetch
Fetch - ΡΡΠΎ ΡΠ»ΡΡΡΠ΅Π½ΡΠΉ XMLHttpRequest, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄Π΅Π»Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ, ΡΡ ΠΎΠΆΠΈΠ΅ Ρ XMLHttpRequest (XHR). ΠΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΎΡΠ»ΠΈΡΠΈΠ΅ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Fetch API ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Promises (ΠΠ±Π΅ΡΠ°Π½ΠΈΡ), ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠ΅ ΠΈ ΡΠΈΡΡΠΎΠ΅ API, ΠΈΠ·Π±Π΅Π³Π°ΡΡ ΠΊΠ°ΡΠ°ΡΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° callback'ΠΎΠ².
Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π° fetch
:
let promise = fetch(url, [options])
url
β URL, Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΄Π΅Π»Π°ΡΡ Π·Π°ΠΏΡΠΎΡ,options
β Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ Π·Π°ΠΏΡΠΎΡΠ°.
ΠΠ΅Π· options
ΡΡΠΎ ΠΏΡΠΎΡΡΠΎΠΉ GET-Π·Π°ΠΏΡΠΎΡ, ΡΠΊΠ°ΡΠΈΠ²Π°ΡΡΠΈΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ url
.
ΠΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ fetch
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΠ ΠΠΠΠ‘, ΠΊΠΎΡΠΎΡΡΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ ΠΎΡΠ²Π΅Ρ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΊΠΎΠ»Π»Π±ΡΠΊΠΈ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ Response ΠΈΠ»ΠΈ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ, Π΅ΡΠ»ΠΈ Π·Π°ΠΏΡΠΎΡ Π½Π΅ ΡΠ΄Π°Π»ΡΡ.
ΠΡΠΎΡΠ΅ΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΡΠ²Π΅ΡΠ° ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² Π΄Π²Π° ΡΡΠ°ΠΏΠ°.
ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ
, promise
Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Response Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ²Π΅Ρ ΠΏΡΠΈΡΠ»ΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΎΡΠ²Π΅ΡΠ°.
ΠΠ° ΡΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΡΠ°ΡΡΡ HTTP-Π·Π°ΠΏΡΠΎΡΠ° ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, Π²ΡΠΏΠΎΠ»Π½ΠΈΠ»ΡΡ Π»ΠΈ ΠΎΠ½ ΡΡΠΏΠ΅ΡΠ½ΠΎ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, Π½ΠΎ ΠΏΠΎΠΊΠ° Π±Π΅Π· ΡΠ΅Π»Π° ΠΎΡΠ²Π΅ΡΠ°.
ΠΡΠΎΠΌΠΈΡ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ, Π΅ΡΠ»ΠΈ fetch
Π½Π΅ ΡΠΌΠΎΠ³ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ HTTP-Π·Π°ΠΏΡΠΎΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈ ΠΎΡΠΈΠ±ΠΊΠ΅ ΡΠ΅ΡΠΈ ΠΈΠ»ΠΈ Π΅ΡΠ»ΠΈ Π½Π΅Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠ°ΠΉΡΠ°. HTTP-ΡΡΠ°ΡΡΡΡ 404 ΠΈ 500 Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ.
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ²ΠΈΠ΄Π΅ΡΡ HTTP-ΡΡΠ°ΡΡΡ Π² ΡΠ²ΠΎΠΉΡΡΠ²Π°Ρ ΠΎΡΠ²Π΅ΡΠ°:
status
β ΠΊΠΎΠ΄ ΡΡΠ°ΡΡΡΠ° HTTP-Π·Π°ΠΏΡΠΎΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ 200.ok
β Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅: Π±ΡΠ΄Π΅Ρtrue
, Π΅ΡΠ»ΠΈ ΠΊΠΎΠ΄ HTTP-ΡΡΠ°ΡΡΡΠ° Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 200-299.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
let response = await fetch(url);
if (response.ok) { // Π΅ΡΠ»ΠΈ HTTP-ΡΡΠ°ΡΡΡ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 200-299
// ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ΅Π»ΠΎ ΠΎΡΠ²Π΅ΡΠ° (ΡΠΌ. ΠΏΡΠΎ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π½ΠΈΠΆΠ΅)
let json = await response.json();
} else {
alert("ΠΡΠΈΠ±ΠΊΠ° HTTP: " + response.status);
}
ΠΠΎ-Π²ΡΠΎΡΡΡ , Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ΅Π»Π° ΠΎΡΠ²Π΅ΡΠ° Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄Π°.
Response
ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΡ
Π½Π° ΠΏΡΠΎΠΌΠΈΡΠ°Ρ
, Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ΅Π»Ρ ΠΎΡΠ²Π΅ΡΠ° Π² ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΡΠΎΡΠΌΠ°ΡΠ°Ρ
:
response.text()
β ΡΠΈΡΠ°Π΅Ρ ΠΎΡΠ²Π΅Ρ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΡΠΉ ΡΠ΅ΠΊΡΡ,response.json()
β Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΡΠ΅Ρ ΠΎΡΠ²Π΅Ρ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ JSON,response.formData()
β Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΡΠ²Π΅Ρ ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡFormData
(ΡΠ°Π·Π±Π΅ΡΡΠΌ Π΅Π³ΠΎ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π³Π»Π°Π²Π΅),response.blob()
β Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ°ΠΊ Blob (Π±ΠΈΠ½Π°ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Ρ ΡΠΈΠΏΠΎΠΌ),response.arrayBuffer()
β Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΡΠ²Π΅Ρ ΠΊΠ°ΠΊ ArrayBuffer (Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π±ΠΈΠ½Π°ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ ),ΠΏΠΎΠΌΠΈΠΌΠΎ ΡΡΠΎΠ³ΠΎ,
response.body
β ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ ReadableStream, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡ ΡΠ΅Π»ΠΎ Π·Π°ΠΏΡΠΎΡΠ° ΠΏΠΎ ΡΠ°ΡΡΡΠΌ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΠ»ΡΡΠΈΠΌ JSON-ΠΎΠ±ΡΠ΅ΠΊΡ Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌΠΈ ΠΊΠΎΠΌΠΌΠΈΡΠ°ΠΌΠΈ ΠΈΠ· ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π½Π° GitHub:
let url = 'https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits';
let response = await fetch(url);
let commits = await response.json(); // ΡΠΈΡΠ°Π΅ΠΌ ΠΎΡΠ²Π΅Ρ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ JSON
alert(commits[0].author.login);
Π’ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π±Π΅Π· await
, Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΠΌΠΈΡΠΎΠ²:
fetch('https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits')
.then(response => response.json())
.then(commits => alert(commits[0].author.login));
ΠΡΠΈΠΌΠ΅Ρ Π±Π΅Π· await:

ΠΠ±ΡΠ΅ΠΊΡ response
ΠΊΡΠΎΠΌΠ΅ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌ headers
, ΡΡΠ°ΡΡΡΡ status
ΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΠΎΠ»ΡΠΌ ΠΎΡΠ²Π΅ΡΠ°, Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ Π΅Π³ΠΎ ΡΠ΅Π»ΠΎ, Π² ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅, ΡΡΠΎ Π±ΡΠ»ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π²ΡΡΠ΅.
ΠΡΠΎΠ³ΠΎ:
Π’ΠΈΠΏΠΈΡΠ½ΡΠΉ Π·Π°ΠΏΡΠΎΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ fetch
ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π΄Π²ΡΡ
ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² await
:
let response = await fetch(url, options); // Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ ΠΎΡΠ²Π΅ΡΠ°
let result = await response.json(); // ΡΠΈΡΠ°ΡΡ ΡΠ΅Π»ΠΎ ΠΎΡΠ²Π΅ΡΠ° Π² ΡΠΎΡΠΌΠ°ΡΠ΅ JSON
ΠΠ»ΠΈ, Π±Π΅Π· await
:
fetch(url, options)
.then(response => response.json())
.then(result => /* ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ */)
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΎΡΠ²Π΅ΡΠ°:
response.status
β HTTP-ΠΊΠΎΠ΄ ΠΎΡΠ²Π΅ΡΠ°,response.ok
βtrue
, Π΅ΡΠ»ΠΈ ΡΡΠ°ΡΡΡ ΠΎΡΠ²Π΅ΡΠ° Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 200-299.response.headers
β ΠΏΠΎΡ ΠΎΠΆΠΈΠΉ Π½Π°Map
ΠΎΠ±ΡΠ΅ΠΊΡ Ρ HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ.
Useful links:
Framework vs library
Π€ΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ - ΡΡΠΎ Π½Π°Π±ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ². ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° - ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΡΠ·ΡΠΊΠ΅.
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° - ΡΡΠΎ ΡΠ±ΠΎΡΠΊΠ° ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΉ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΠ΅Π½Π° ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΏΠΎΡΠΎΠΌ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ . ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΠΈΠ΄Π΅Ρ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ ΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Ρ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.
Π€ΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ - ΡΡΠΎ ΠΊΠ°ΡΠΊΠ°Ρ Π΄Π»Ρ Π±ΡΠ΄ΡΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠΎΠ±ΡΠ°Π½Ρ Π²ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ: Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΡΡΡΡΠΊΡΡΡΠ°, Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ΄ ΠΈ Ρ.Π΄. ΠΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½Π°Ρ Π·Π°Π³ΠΎΡΠΎΠ²ΠΊΠ°, Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΡ Π±ΡΠ΄Π΅ΡΠ΅ Π΄ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΠΈ ΡΡΡΠΎΠΈΡΡ Π΄Π°Π»ΡΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠ°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π·Π° ΡΡΠ΅Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΠΆΠ΅ Π΅ΡΡΡ ΠΈ Π·Π°Π±ΠΎΡΠ»ΠΈΠ²ΠΎ Π΄Π»Ρ ΠΠ°Ρ Π·Π°Π³ΠΎΡΠΎΠ²Π»Π΅Π½ΠΎ.
Π€ΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ β Π΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, Π½Π΅ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π²Π°ΠΌΠΈ, Π° Π½Π°ΠΎΠ±ΠΎΡΠΎΡ, Π²Π°Ρ ΠΊΠΎΠ΄ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΈΠ· Π½Π΅Π³ΠΎ.
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° β ΡΡΠΎ Π³ΠΎΡΠΎΠ²ΡΠΉ ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π½Π°Π±ΠΎΡ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π±Π΅ΠΆΠΈΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ. Π’ΠΎ Π΅ΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠ°ΡΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
API - ΡΡΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ ΠΈΠ·Π²Π½Π΅. Π£ ΠΠ°Ρ Π΅ΡΡΡ ΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π³ΠΎΡΠΎΠ²ΡΠΉ ΠΏΡΠΎΠ΄ΡΠΊΡ ΠΈ ΠΎΠ½ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ½ΡΠΌ ΡΡΠΈΠΊΠΎΠΌ ΠΈ ΠΡ Ρ ΠΎΡΠΈΡΠ΅, ΡΡΠΎ Π±Ρ ΠΈΠΌ ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ Π½ΠΈΠΌ ΠΈ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΠ΅ ΠΈΡ , Π° ΡΡΠΎΡΠΎΠ½Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠΌ ΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ. ΠΡΠΎ ΡΠ°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ: Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ ΠΊ ΠΊΠΎΠ΄Ρ Π²Π½Π΅ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡΠΎ Π½Π°Π±ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ Π²Π½Π΅ΡΠ½ΡΡ Π΄Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΡΡΠ½ΠΎΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ.
Linked list
Big O
ES2015
CoreHTML
CoreCSS (flexbox, positioning)
CoreJS
Design patterns
Architectural Patterns []
FE optimization / Performance
DOM/BOM
Agile/SCRUM
tasks
reduce, filter, map, forEach, DOM traversing
Last updated
Was this helpful?