You are on page 1of 59
eg r00p nto Your mindset and generat worfiow SHANE HUDSON feelance frontend website developer KYLE SIMPSON SCOPE & CLOSURES 20.08.2017 yourdont-knowj-rutecimd at master -azabiolyou-dont-know-j-rd - GitHub You Don't Know JS: this & Object Prototypes *Table of Contents * Foreword * Preface © Chapter 1: this Or That? © Why this? © Confusions © What's this? * Chapter 2: this All Makes Sense Now! © Calk-site Nothing But Rules © Everything In Order © Binding Exceptions © Lexical this * Chapter 3: Objects © Syntax © Type © Contents © Iteration * Chapter 4: Mixing (Up) "Class" Objects © Class Theory © Class Mechanics © Class Inheritance © Mixins * Chapter 5: Prototypes © [[Prototype]] © "Class" © “(Prototypal) Inheritance” © Object Links * Chapter 6: Behavior Delegation © Towards Delegation-Oriented Design © Classes vs. Objects Simpler Design © Nicer Syntax © Introspection Appendix A: ES6 class © Appendix B: Acknowledgments htlps:fgitnub com/azatiolyou-dont-knowjs-sublobimasterthis%20%26%.200bjec20protolypesioc md wu 20.08.2017 you-dont-know-js-rulcht.mdl al master - azaolyau-dont-knowej-ru ~ GitHub [napa 1: Uto Takoe o6acTb BUAMMOCTU? Onna v3 cambix @yHAaMeHTanbHbix NapagHrm MOUTH Bcex A3bIKOB NPorpaMMMpoBAHA — BO3MOXHOCTe COXPAHsTe SHAMEHMA B NPEMEHHBIX, a NODKE WSBNEKATS WIN MeHATb ITH BHAUEHIAA Co6crBeHHo, B03MO>XHOCTS xpaHitTh 3HAYEHIMA M1 WaB/eKaTS 3HAYEHMA 3 NepeMeHHbIX — 3TO TO, ro gaer nporpamme cocmosnue. Bes Takoro KOHUenTa nporpaMMa Morna 6bI BbINOAHATS HeKOTOpble 34qa4H, HO OHM ObINH 6b BeCbMa OrpaHAMeHbI M He 6bIAM 6b| OMeHb Yk MiHTepecHl Ho skntoueHne nepemeHHbIx B Hay nporpammy nopoxaaeT Cable MHTepecHble BoNpocbl, KoTOpbie MBI Teneps 2aqaqum: rae 3TH NepemeHHsie xKUeym? /Ipyrumu chogaMn, Ae OHM xpanarca? Vi, uTo Gonee B@KHO, Kak Hallla NporpaMMa Mx HaxOAMT, Kora HyKAaeTCA B HMX? 31m Bonpoce! roBopst o HeO6xoAMMOCTH XopoUIO ONPeAeneHHOro HaGopa npaBWn ANA xpaHenna NepemeHHbIx B HeKoeM MecTe M1 Ain O6Hapy>keHinA 3TH NepeMeHHbIx no3aHee. Mbl Ha30BeM 3TOT Ha6op npaaiin — O6nacmé eudumocmu. Ho rae u kak npaewna sTux o6nacmeti eudumocmu ycranaBsnearorcs? °>Teopua KomnunaTopoB 310 MoxXeT 6bITe CAMOOYeBNAHO WAM 3TO MOET YAVB/STD, B 3ABMCHMOCTH OT Balero yposHa B3anMogelicTaua c pasnnunblx sablkaMM, HO HECMOTpA Ha ToT akT, UTo JavaScript nognagaet nog, o6uylo KaTeropiio "AnHammueckux" wan "MHTepnpeTMpyeMbix" sabiKoR, Ha CaMOM jee OH sBsReTCA KOMNIIMPYeMBIM AabIKOM. OH He KOMNUsMpyeTca 3apatee, Kak MHOrMe TpaqMVOHHO KOMMMANPYeMbIe ABbIKH, M Pe3yAbTATbI KOMNMARLIYN He ABIAIOTCA NepeHOCHMBIMH pean pagnuunbix pacnpeneneHHbix cHicTeM. Ho, Tem Hi MeHee, cpeqa UcnonHeHna JavaScript abinonHAeT MHOrO Tex xe WaroB, UTO M M106011 TPAANYNOHHbI KOMNUARTOp A3bIKa, XOTb KM Gomee CAOXHBIMM CNOCoBAMHY, YeM MbI O6bI4HO MoxeM npegcrans. B rpaguuMoHHom npouecce #3bIKoBOH KOMNMAAMM, YacTb KOAAa Bach NporpaMM! O6bINHO Npoxogur Tpx wara do Toro, Kak 6yAer BbinomHeHa, @ OSUyMX Yeptax HaabiaaeMbix "KoMNunayned": 1, Pas6merine Ha neKcembt (Tokenizing/Lexing): pas6neHne crpokM CAMBOnOB Ha MMetou\ve cMbicn (qa sabika) YaCTH, HaabIBaeMbIe JeKcemamn. HanpuMep, npegcTasete nporpammy: var a = 2;. 31a nporpamma, enone BepostHo, 6yaer paséuTa Ha cheayrouyne JeKceMbI: var, a, =, 2H 5. Mpo6en Moxer 6bITb CoxpaHeH WN He COxpaHeH Kak AeKceMa & 3a8MCMMOCTH OF Toro UMeeT OH CMBICA WM Her. Npumevanve: Pasnnya mexay tokenizing u lexing — easa pasnnunma u TeopeTmueckaa, HO ona cocpefoTaunBaercs Ha TOM, MAeHTA>UUMPYIOTCA AM 3TH NeKCeMb! KaK 6e3 cocmoHus wn c cocmosHuem. Mpouje roBops, eciu ToKeHuaaTop ucnonbayeTcs, 4TO6bI BbiablBaTb NpaBMna Napcatra c COxpaHeHVieM COCTOAHMA AVIA BbIACHEHMA ChepyeT AM cUMTaTb aOTAEMbHO! NeKceMOl Win ToNbKO YaCTHIO APyTO! NeKcembI, 3mo Byer lexing. hlps:fgivwub com/azatiofyou-dont-knowjs-sublobimaster!scope%20%26%20closuresicht.md ano 20.08.2017 you-don-knowe-uleh dal maser azatofyou-dont-know eu GRHub 2, Napennr: Geper notox (Macca) nekcem 1 npespaulaer ero & Aepeso BNOKEHHIX 31eMeHTOB, KoTOpbie coo6uja NpeACTasnatoT rpamMaTHueckyto CTpykTypy NporpamMbl. 3ro Aepeso Haabigaerca "AST" (Abstract Syntax Tree, qepeso a6ctpakrHoro cuTakcnca).. Takoe Aepeso ana var a = 2; MoxeT HauiHaTbcA c y3/ia BepxHero ypoBHs C Ha3BaHVeM VariableDeclaration, C AOUepHMM Y3/1OM Identifier (4be 3Ha4eHe paBHo a) V ellie OHM AOUEPHMM y3/0M AssignnentExpression, y KOTOPOTO TOXe eCTb AoVepHMTt y3en NumericLiteral (4be 3Ha¥eHne paBHo 2). 3, Tenepauna Kona: npoyecc Bastia AST 4 npeBpauenna ero @ UcnonHsembIl KoA, 3Ta YacTe CUAbHO 2aBMCMT OT s3bIKa, MMaTOpMbI HasHaveHiA WT.N Vira, smecto Toro, YTo6biI yBa3aTb B JeTANAX, MbI MPOCTO ONYCTHM MX HM CKaDKEM, UTO CT cnocoé Baste Hae abiuieonucaHHoe AST asa var a = 2; “ NpespatuTs ero 8 Habop MaUIMHHbIx MHCTPYKUNM, UTOGbI B AelicTaMTeNbHOCTH coadamb NepeMeHHyto VMeHeM a (BKIOWaA BbigeneHne namaTn v1 T.A,), a 3aTeM COXpaHitTb aHaueHHe B a, Npumevanve: nogpo6Hocta Toro, Kak AB¥2KOK ynpaBaseT cHcTeMHBIMM pecypcamn, rmy6xe, em Mbi 6yAeM "KonaTb", OSTOMY MBI BCeTO AVUb Mp¥MeM Ha Bepy, 4TO ABMXOK yMeeT coaapate 1 CoxpalisTe nepeMeHHble, Kora HeO6xOAMMO. Apixox JavaScript ropasno choxkHee, 4eM mosbko 3TH TPH Wara, Kak M BONbLINHCTBO ApyTAX AabIKOBbIX KOMNMASTOPOR. HanpMMep, 8 NPOYecce napculira W reHepaynn KAA 6esycAOBHO ECT Wari no onTHMM3a\unn SbIcTpogelicTBMA BbINOAHEHHA, BKNIOYAR YAANeHNe AMUIHNX 3neMeHTOB. Tostomy 3qecb A AML OvepunBato rpaHinubi. Ho a AyMato, UTO abi CKOpo yavauTe Towemy amu AeTaNM, KOTOpbIe MbI O6AZaMeMbHO PacCMOTPAM, XOTb M Ha BoNee BBICOKOM yposHe, censane. Ana Havana, aamxkn JavaScript He 6anytor pockoulbio (kak ApyrHe #abIKoBbIe KOMNMARTOpE) 3aTpar MaCcbi BpeMeHN Ha ONTHMM3aLINIO, Tak Kak KOMNMAALUNE JavaScript He nponcKoAMT Ha Ware C6opkn sapanee, Kak 8 APYTAX AabIKAX. Apa JavaScript, KoMNMARYA BO MHOTMX Chy4aRX NPONCKOAMT 3a BCETO AML MUKPOCeKyHAb! (WAN MeHbule!) nepeg abinonHeHvem Koga. Uro6bI rapaHTmporaTe ebicovaliuee 6eicTpopelicreve, Aswxkn JS ucnosb3yioT Bce BYAbI ynoBOK (Takue kak JIT, KoTOpBI KOMNMAMpyeT NeHHBO Hake nepekomnuaupyer Ha xogy), KOTOpsie He “oBnactn” Hawero Obcy>xqeHHA TYT. Aawaiire ckaxkem, npoctorel pag, TO mo60i KoA JavaScript omer 6bITe CKOMNMANPOBAH AO (06ui4Ho npamo nepep!) ero BbinonHeHMa. MosToMy, KoMnunsTop JS BosbMeT NporpaMMy var a = 25 W ceped CKOMNMAMNpyeT ee, a NOTOM 6yAET TOTOR BbINOAHMTe ee, OBbINHO Cpaay >e. °>Touumaune o6sactu Bugumoctn Tyre, KoTOpbim Mbi Bygem npu6sMkaracA k OByYEHHIO OBaCTH BMAMMOCTH, 3TO AYMaTe O npouecce 8 Tepmutax quanora. Ho, kmo Beget ToT Auanor? > Alelicreyrouyne nua Berpevaiire aelictayroujnx Anu, KoTOpbie B3aMMopelicTayIOT, YTO6bI O6pa6oraTe NporpamMy var a = 2;. UTO6bI MbI MOrMM MOHST © YeM 4x AuanOr MBI HeMHOro NoAcAyUiaeM HX: hlps:fgivwub com/azatiofyou-dont-knowjs-sublobimaster!scope%20%26%20closuresicht.md 20 20.08.2017 you-dont-know-js-rulcht.mdl al master - azaolyau-dont-knowej-ru ~ GitHub 1, Aeukox: oTBeuaeT 3a KOMNMAAYMIO OT Havana Jo KOHUa M BbINoAHeHve Hauieli JavaScript nporpammel 2. Komnunamop: cann wa apy3eli Jeuxka, ebinonHseT Bcto rpasHyto pa6ory no napennry 4 reHepaymn Koga (cM. npeasiayuynh paszen) 3, OGnacme eudumocmu: euye out apyr Aeuxka; cobupaer n oBcAYKMBAeT CNMICOK NoMcKa BCEX OB bABNEHHEIX MAeHTUdNKaTOpoR (NepeMeHHBIX), “ CeAUT 3a UCnOAHEHKeM cTpororo Habopa pasa o TOM, Kak 3TH YAeHTHGNKATOpbI AOCTYNHBI ANA KOAa, BBINOAHAEMOTO B TeKyLLW MomeHT. Ana nonHozo noHumatun kak pa6oraet JavaScript, 8am HeoGxoquMo Hatat dymame Kak Jeuxox (i ero Apy3bs), 3a1aBAT BONPOCbI, KOTOPbIe 3aalOT OHM M OTBCMATb Ha Hinx TAKE. ? Tyga u o6paTHo Korga sbi suqute nporpammy var a = 25, BbI BePORTHee Bcero NoAyMaeTe O Heli Kak 06 ORHOM oneparope. Ho Haul HoBbIit apyr JewxoK Bigut ato He TaK. Ha caMoM ene, JJeuxoK sHANT ABA oTAeAbHEIK Onepatopa, AMA, KoTOpEIi KoMnusAmopoGpaboTaeT BO BpeMA KOMNMARLIN, a Apyroii, koropeit JJeuxok o6pa6oraet BO BpeMs BbINONHeHMA. Tak qasaiire xe pasGepem no nonouKaM kak {JeuxOK ero Apy3bA NoctynaT ¢ NporpaMMoii var a 223 Nepeas eeus, koTopyio caenaet Komnunamop ¢ 2Tol4 nporpamMol, abinonHT pas6neHne Ha AeKceMbi, KoTOpbIe OH 3aTeM pacnapcut B AepeBo. Ho Koraa Komnunamop aobeperca Ao reHepaun Kofa, oH 6yzet MHTepnpeT“pozats nporpaMMy Heckombko No-Apyromy Hexenn npegnonaranoce. O6ocHoBaHHbiM npepnonoxkeHnem 6yger To, Yo KoMnunamop nopoaVT KoA, KOTOpBIA MOxKHO kparko npegcraaTe CneayioujnM nceeqo-KofoM: "BeiqenkTs NaMsTe AA NepeMeHHOl, nomeTHTe ee Kak a, 3aTeM NOMeCTHTb 3Ha4eHne 2 8 aTY NepeMeHHyto." K CorkaeHiito, 370 He COBCeM TOUHO, Komnunamop smecto storo caenaet cnegyiouiee: 1. Betperna var 2, Komnunamop npocut O6nacms audumocmu nocmorpere cyuectayer aK yxe NepeMenHan a 8 KOANeKYMH ykazaHHO; OBnacTh eMpMMocTH. EcnM 4a, To Komnunsmop urHopupyer 370 oBpABneHNe nepemeHHoli w asHraetca panbiue. B npotusHom cry4ae, KoMnusamop npocut O6;acme eudumocmu of baBiTs HOBYIO NepeMeHHyto aB KOAMEKYMN ykazaHHO O6;acTH BMAMMOCTH. 2, 3atem Komnunamop revepupyer KoA ana JeuxKa ANA nocnepyiowjero BbINOAHEHMA, HTO6bI o6pa6orars npuceansanue a = 2. Kop, KoTopblii Aleuxox sanyckaer, cHauana cnpawnsaet O6nacme eudumocmu ect 1M NepeMenHaa c uMeHeM a, AOCTyNHaR B KOATEKUNH TeKyuje” o6nactu avgumocta. Ecan Aa, To JeuxoK ucnonbayer aTy nepemenHyto. Eon Her, To Jewxox nujer @ dpyzom mecme (cm. paznen BnoxenHaa o6nacmb audumocmu Hw%xe). Ecan Jeuxok 8 vrore HaxoauT nepemeHHyto, OH npAcsansaeT ei sHaYeHne 2. Eca HET, To AeuxoK BckuHeT pyki 1 BbIKPIKHET “olM6Kal"! hlps:fgivwub com/azatiofyou-dont-knowjs-sublobimaster!scope%20%26%20closuresicht.md ano 20.08.2017 your-donstomje-lchtsnd al maser azabalyoudont-knowjesu GMb Noggogs worn: aan npuceanBaHua 3HaveHuAa NepeMeHHON BbINOAHAeTCA ABA OTAEABHbIX aelicrana: nepsoe, Koununamopobesgnset nepemeniyto (ecm He 6bina OB bAB/eHa AO sTOFO B Texyulelt O6acTH BHAMMOCTH), M BTOPOE, KOrAa BbINONHAeT KOA, JewKOK VIET 3TY NepeMeHHyio 8 O6nacmu eudumocmu 4 npuceanaaer elt 3Ha¥eHne, ecnn HaxoaMT. ? Komnuaatop pacckarket Ham Hy>kHo ee HeMHOro KOMNMARTOPHON TepMAHONOrM, HTOBbI ABHHYTECA AanbIue Korga JeuxXox stinonHser Kog, KoTopei Komnunamop revepmpyer Ha ware (2), oH AomKeH NowckaTe NepeMenHyto a, 4TOGbI yavAeTh Sbia AM OHa OBBABAEHA Mi 3TOT NONCK NpHMHAMaeT BO BHuMaHne OGnacms euduMocmu. Ho Tun noncka, KoTOpbi BkinonHseT JeUxoK, BruseT Ha peaynbrat noneka B Hawem cayuae, oH roBopuT, TO JeuxoK BbiINoAHMT "LHS"-nonck nepemeHHoli a. Apyrol tan nowcka Hasbigaetca "RHS', Aepxy nap, sro 861 Moxere yragiats WTo 3Hasar “L" 4 "R". 3TH TepMitibl osHawator “Left-hand Side" (nesan cropoxa) "Right-hand Side" (npagan cropoxa). Cropona... vero? Onepaynu npnceaneanna. Vein cnosamu, LHS-nowck sbinonHAerca, Kora nepemeHHa NoABAReTCA C NeBO! CTOPOHb! onepauwn npnceaneania, a RHS-nouck BbinonHaeTca, Kora NepeMeHHas nosBaReTca c NpaBoii CTopoHt! onepayyn npuceaneaHna Ha camom gene, aasalite 6ygem Gone Tounbi. RHS-NOnck HeoTAMYNM, ana HAWK Yenel, OT npoctoro noncka 3Ha¥eHMA HEKOTOPO;t NepemMeHHO’, Torga Kak LHS-nowck nbiTaeTcA HaliTH cam. KonTeliHep nepeMeHHok, 4706sI OH Mor npicBoMTs sHaveHne. TakMM o6pasom, RHS He o6nsamenbHo o3Havaer "npasaa cropoHa npiceanBanus no cyuyecrBy, OH Npocro 6onee TOWHO O3HauaeT "He seBaA CTopoHa’. Npiknrysusncs HeMHoro NosepxHOCTHBIM Ha MMHYTY, BbI MO>KeTe rogyMars, YTo "RHS" BMecTo sToro sHaunt “retrieve his/her source (value)" (nonyaTe ero/ee ucxopHoe sHaveHMe), NpeqcTasaan, uto RHS osHayaer "Wan M BoabMA 3HaueHHe 13. Aasalire koniiem HemHoro ray6xxe & Tom HanpagneHnn. Kora @ rosopio: console. log( a ); Cobinka Ha a— 3To RHS-ccinka, noToMy 4To 3gecb Hero He MpHCeanBaeTce # a. HanpoTHe, Mbt BbINOAHAEM NONCK, HTO6bI HABNEUb BHAVEHNE a, ANA TOTO, YTOGEI NepesaTe sHaueHNe B console. log(..). Apa cpasnenns: a=2 hlps:fgivwub com/azatiofyou-dont-knowjs-sublobimaster!scope%20%26%20closuresicht.md 4n0 20.08.2017 you-dont-know-js-rulcht.mdl al master - azaolyau-dont-knowej-ru ~ GitHub Cebinka Ha a 3gecb — ato LHS-ccbinka, Tak Kak Mbl He 3a60THMCA 3.eCb 0 TOM, KaKOBO TeKyulee 3HaveHve, MBI MPOCTO XOTHM HaliTH STY NepeMeHHy!o Kak YeNb ANA ONepaynn npucsansaHn Npumeyanue: LHS 1 RHS, osHavaiowe "neaas/npagas cropoHa npuceanBanun", He O6s3aTeABHO 6ykeanbHo o3Hauator "negan/npagaa cropoxa onepaunu npucaangarins -", EcTb euye HECKOMbKO cnoco6os, KoTOpbIMM NpoNaBOAMTCA NpCBaMBaHHe, M NosTOMY Aye KOHLIeMTYaNbHO AYMaTb O HeM Kak: "KTO ABAAETCA Lebo NpucBavBanua (LHS)" w “kTO McTOUHMK NpucBauBaHna” (RHS)". Mpegctaesre Takyio nporpammy, 8 KoTOpoi ectb o6e ccbinki LHS 4 RHS: function foo(a) { console.log( a); // 2 foo( 2): Nocaeguaa crpoka, KoTopas akTvBvaupyeT foo(..) Kak BbI308 dyHKUNM, TpebyeT RHS-ccbinKy Ha foo, UTO SHa4MT, "cXOAM HaiiaN sHaveHNe foo 1 Aait ero MMe", Bone Toro, (..) osHa¥aer, 4TO aHaUeHve foo JOMKHO ObiTb BbINONHEHO, NlosTOMy 3TO Ckopee Acero dyHKUNA! 3pecb ect esa ynosMoe, Ho BaKHOE NPHCEanBaHne. BbI O6HAPYKMAM ero? Boi HaBepHoe ynyctwn HeABHOe a = 2 8 3TOM Koge. 3TO Nponcxogur, KorAa aHaueHne 2 nepepaerca Kak apryMeHT & yHKUMIO foo(..), 8 TOM cayuae aHaueHne 2 npuceanBaerca napamerpy a. YTo6bi (HeABHO) NPUCBONTb 3HaveHVe NapaMerpy a, abinonietca LHS-nouck. Tatoke ect 1 RHS-ccbiika Ha 3HaveHHe a v1 9TO peaynbTupyroulee aHaveHne Nepegaerca 8 console. log(..). console. log(..) HyakHa Ccbinka Ana BbinonHeHua, Jaa o6wekTa console 370 RHS- Nowck, 3aTeM NPONCXOAMT paapeweHne MMeHH CBOlicTaa YTOBbI yOeAMTECA CyL4eCTEYeT AM MeTOA, Haabigaembiii log. Hakoneu, MbI MOKeM OCMBICATb, YTO ecTb LHS/RHS-o6men nepegasaembim sHaueHneM 2 (nyteM RHS-novicka nepemeHHoit a) @ log(..). BHYTp# pogHol peanwaaynn 1og(..), Mbl MOKEM Npegnonoxutb, WTO y Hee ecT napaMerpsi, y NepBoro M3 KOTOPLIX (BOaMOKHO Haabisatoujeroca argi) ectb novck LHS-ccbinky, AO NpuceanBaHua emy 2. Mpumevanue: ¥ aac MoxeT noseinToca co6/asH MpeACTaBAATe OObABNEHNE dyHKUMK Function foo(a) {... Kak O6bIUHOe OBBAB/EHKKE NepeMeHHOl M NpncBaMBaHe, Takoe KaK var foo M foo = function(a){.... Jlenaa Tak, 6yAeT co6aaH AyMat 06 O6wABNEHNM 3TOA dyHKLMH Kak noqpasymesatoujeli LHS-nouck. Onnaxo, eqga 3aMeTHas, Ho BaxkHas pasHuya ecTb 8 Tom, uo KoMnunamop o6pabaTeiBaer Kak oBbaBneHve, Tak W onpepeneHie HaveHina BO Bpema reHepaunn KoAa, E/larogapa eMy, korga Jauxok ebinonHser Koa, He Tpe6yerca HiKaKOl O6pa6orks 4TO6bI “NpHceouTe" 3HaueHne oyHKUMH B foo, CnepoBaTenbHo, HeyMecTHo AYMaTb 06 OBBABNEHKN dyHKUMH Kak O NpucBaMBaHAn C nomouysio LHS-noncka Tem cnoco6om, KOTOpbIii MBI 3qecb OBcy>xAaeM. ? Becega Apyoxka uv O6nactu Buaumoctn hlps:fgivwub com/azatiofyou-dont-knowjs-sublobimaster!scope%20%26%20closuresicht.md 510 20.08.2017 you-dont-know-js-rulcht.mdl al master - azaolyau-dont-knowej-ru ~ GitHub function foo(a) { console.log( a); // 2 Foo( 25 Aaealire npepctasu sbilieykasaHHibit O6MeH Mexay HMM (KoTOpbIl O6pabarbiBaer sTOT KoA) KaK Geceny. Beceqa moxer NoiiTH NpuMepHo Tak: Aeuxox: 34, O6nacme audumocmu, y MeHia ects RHS-ccbinka Ha foo. Koraa-HuByAb cnbiwana © TaKon? O6nacme eudumocmu: Hy paaymeerca, cibiuiana. Komnusamop o6bABIMN ee Bcero CeKyHAY Haaag, 310 dyHKuna, Moxanylicral Aeuxor: Oansno, cnacv6o! Xopowo, # BbinonHAIO Foo, Aeuxox: 34, O6nacme audumocmu, y MeHia ects LHS-ccbinka Ha a, cibiuiana 4TO-HN6yAb O Hel? O6nacme eudumocmu: Hy pasymeerca, cnbiwiana. Komnusamop o6bABIIN ee Kak opmanbHsil Napamerp B foo ToAbKO UT. Noxanyiicral Aeuxox: Orauiaunea kak acerga, OBnacme eudumocmu, CHoBa cnacu6o. A tenepb TpnceovM 2 8 a. Aeuxox: 314, O6nacme eudumocmu, waaniin, UT GecnoKoWo Te6s cHoBa. MHe Hy>keH RHS- Nowek console. KorAa-Hu6yAb CibiWana o TakoM MMeHH? O6nacme eudumocmu: Het npobrem, {JeuxOk, 370 To, Hem § Bech AeHb M 3aHMMatoce. fla, y Melia ecTb console. Ona sctpoentas. Moxkanyiicral Alewxox: Vigeanbio, Nuny 1og(..). Mpesocxogto, 370 SyHkuna. Aeuxox: 34, O6nacme eudumocmu. Mo>keulb NoMoub MHe c RHS-ccbinkoit Ha a? Alymato, 9 ee NOMHIo, Ho NpocTo xouy AMWHH pas NpoBepute. O6nacme eudumocmu: Tei npas, ewxox. Ta >Ke CcbInka, He WaMeHMnace. Noxanylicral Aleuxox: Kpyro! Nepegaio aHavenie a, KoTOpoe paBHo 2, 8 log(. ?Tect Mposepsre eae noHMMaHve Ha HacTORU\Nit MoMeHT. O6s2aTe/bHO chirpalite pon Jewxka 4 noyvacrayiire @ "6ecege" c O6acmbro eudumocmu: function foo(a) { var b = as return a + b5 hlps:fgivwub com/azatiofyou-dont-knowjs-sublobimaster!scope%20%26%20closuresicht.md ano 20.08.2017 you-dont-know-js-rulcht.mdl al master - azaolyau-dont-knowej-ru ~ GitHub , var ¢ = foo( 2); 1. Onpegenmte ace LHS-noncku (4x 3!) 2. Onpegenute ace RHS-nouckn (ux 4!). Mpumevanue: Cm. 0630p soi rnasbi, 4706b1 yaHaTb OTBeTBI Ha TecT! > Bno>keHHaa O6sacTb BUAUMOCTU Mbt rosopumn, sto OGzacme eudumocmu — sto HaGop npasia noncKa NepeMeHHbIx no 4x vipeHtndukaropy. OAHaKo, o6bI4HO GbiBaeT Gonee oAHol O6nacmu eudumocmu. Taroxe kak 610K Wan yHKUMA BKNaqbIBAeTCA BHYTPb APyrOrO EnoKa nan dyHKUWN, OBNACTH BYAMMOCTH BKAAAbIBAIOTCA BHYTPb APyTHx O6sacTelk. ostomy, ecan NepemeHHyto He HaliTH 8 Sawxaiwel o6nacrH eNqUMoCTH, J[@UXOK 3arnAABIBAeT B CReAYIOUIY!O BHELIKIOIO NO OTHOWEHMIO k 3TO O6nacTe BAAKMOCTY, NPOAOMKAs TAK AO TeX Nop, NoKa He HaligeT Wil Noka He AOCTAMTHeT camoii BHeWHel (T.e. rno6anbHol) o6 actu. Npumep function foo(a) { console.log( a + b ); var b foo( 2); // 4 RHS-ccbinka Ha b He MoxeT 6bITb paapeulena SHYT dYHKUUMM Foo, HO OHA MOXKET BbITS paapewena 8 O6nacmu eudumocmu, oKpy-xaioused ee (8 3TOM cayyae, rnoGanbHor). Tlosromy, euje paa nepecmorpes Gecensi mexay Jlewxkom w OBnacmoio eudumocmu, Mi BO3MOXKHO yCABILMM: Aeuxox: "34, O6nacms eudumocmu foo, uTo-Hubyp CAbiuiana ob? ¥ MeHA ect RHS-ccbinka Ha Hee", O6nacme eudumocmu: "He-a, HuKorfa He CabIWiana Oo Tako. Nonpobyi4 yTo-Hubyab Apyroe!! Aeuxox: "3i, O6nacms eudumocmu cHapyku foo! O, Tel euje M rnoGanbHas O6nacme eudumocmu, Kpyto. Korga-Hu6yab cabiuiana 0 b? Y MeHa ects RHS-ccbinka Ha Hee. O6nacme eudumocmu: "fla-na, KoHeYHO ect. Noxkanyiicra!” Mpoctole npaeuna npocmotpa enoxkeHHbix OGnacmeti eudumocmus: /Jeuxox HaunHaer e TeKyu\er abinoninemol O6nacmu eudumocmu, MueT & Heli nepeMeHHyto, 3aTeM ecnn He HaxoaMT, Mpogomkaet Nock ypoBHeM BbiWle W Tak Aanee. Ecn OCTHTHYTa CaMan BHEHAR rnoBanbHaR hlps:fgivwub com/azatiofyou-dont-knowjs-sublobimaster!scope%20%26%20closuresicht.md 110 20.08.2017 you-dont-know-js-rulcht.mdl al master - azaolyau-dont-knowej-ru ~ GitHub o6aacts BngUMocTy, NONck OCTaHaB/MBaeTCA, He2aBNCHMO OF Toro, Halen OH NepeMeHHyio WK er. ? Bepem 3a OcHoBy MeTadopbl Ana evayanwaayyn npouecca paapeuienva Bo BnoxkeHHbix O6acmax auduMocmu, @ xoUy, 4TO6bI bi NoAyMann 06 3TOM BbICOKOM 3faHMn, A g & ea 3ganine cumBonuaupyet Ha6op npaswn BnoxeHHbIX O6acmeti euduMocmu Hauielk nporpaMMl. Nepesiit sak 3ganua npegcrasaser sawly TeKyLlyio BbinomHeMyio OBnacms eudumocmu, rae 6b BbI Hi Obi. BepxHinit yposeHb 3gaHia — 3To rno6anbHaa OGaacms eudumocmu. Boi paspewaere LHS- m RHS-ccbink ua Ha BaUleM TeKyL\eM 3Taxe, a ECM BbI He HAWIAN 4TO vickann, NoAHMMaeTecb Ha MOTE Ha ChepyIoU\Nk 3TaX, Mua TAM, 3aTeM Ha cneAyIOUWit HM TAK Aanee. Kak TonbKo abi nonagaere Ha BepxHvis sTax(ro6ansHaa O6nacme audumocmu), abi nu60 HaxoauTe To, 410 UckasM, M60 He Haxogure. Ho B M1060M Cry4ae BbI JO/KHBI OCTAHOBMTECA, > Own6Ku Novemy umeer 3HaueHue HaabiBats nonck LHS win RHS? Totomy sto 31m ga Tuna noncka Benyt ce6s o-pasHoMy 8 oBcTaHoBke, Korga nepeMeHHan ellie He 6bina o6basnetia (He 6bina HaligeHia HMB opHOM NpocMoTpeHHo OGnacmu eudumocmu). Mpegcrasere: function foo(a) { console.log( a + b ); b=a hlps:fgivwub com/azatiofyou-dont-knowjs-sublobimaster!scope%20%26%20closuresicht.md ano 20.08.2017 you-dont-know-js-rulcht.mdl al master - azaolyau-dont-knowej-ru ~ GitHub + Foo( 2); Kora nponcxogur RHS-nonck b nepabili pas, oHa He 6yqeT HaliqeHa. ITO Kak 6bI “Heo6baBneHHan” nepementias, Tak Kak OHa He 6bula Haiigena B 3TO O6macTn BAAMMOCTH Ecan RHS-nonck He cMoxer Korfa-n60 Halim nepemeHHyto, 8 110604 u3 BnOxKeHHbIX O6nacmeii eudumocmu, >To npuBeper k Bo3BpaTy JewxKoM OWMBKH ReferenceError. BaxkHO OTMETHTS, YTO 3Ta owm6Ka Meer THN ReferenceError. Hanporue, ecan Jewxok ebinonaet LHS-nonck w gocturaer BepxHero aTaka (rnobansHor O6nacmu eudumocmu) 1 He HaxCAUT HiNUero, H ech NporpamMa He aanyuleHa & “ctporom pexuMe", To 3aTem roBanbHan O6nacms eudumocmu coaqact HOByIO NepeMeHHyio ¢ TaKHM HMeHEM B MoGanbHo o6nacTa BHAMMOCTH 1 MepepAcT ee OBpaTHo JJaUxKy. "Hem, do 3mozo He 6ei10 Hu odHoli u A M106e3H0 cosdana ee Ana me6a." "Crpornit pexum'", koTopeil 6bi7 aoGaBneH 8 ESS, uMeeT pag pasHbix OTAMUNH OT O6LINHOTO/ Hectpororo/neHvBoro pexnma. OgHo Takoe OTMMUMe — 3TO To, UTO OH 3anpewaeT aBToMaTVeckoe/HeaBHoe coaqanve MoGanbibix nepemenHelx. B 31M caywae, He 6biN0 61 Hukakoli nepemeHHoli @ rno6anbHol O6aacmu eudumocmu, uTo6bl Nepepate o6patHo oT LHS- noncka, v Jjeukok abi6pocwt ReferenceError aHanorMuHo ciyyato c RHS. Teneps, ean nepemeniias Haiiqena 8 xoge RHS-rovicka, HO BbI MbITaeTecb CqenaTe 4T0-To ¢ ee 3HaeHVeM, UTO HeBO3MOXHO, HaNPHMep, MbITaeTecb BbINOAHMTE Kak dyHKUMIO He- oyHkuMoHanbHoe aHaveHMe Wan CchuIaeTece Ha CBOlicraO 3HaveHMA null WM undefined, To Ae@uxox abigact apyroh ang OwMGKH, HaableaeMull Typetrror ReferenceError — 3T0 CoM paspewleuia uMeHH, cBRZaHHBII c OGaacmeio eudumocmu, TorAa kak Typeérrornoapasymesaer, To paspewieHne umenn B OGnacmu eudumocmu 6b110 ycrewHbiM, Ho 6bina NonbiTka BbINOAHeHMA HeneranbHOro/HeBOIMOXHOTO AeVICTANA C peaymbTaTOM. > 0630p O6nacte evaumoctu — sto Ha6op npaaMn, KoTOpble onpepensior rge M Kak NepeMeHHas (vgeHtiukarop) Moryr 6bitb Haligetibi. TOT nouck MOXET OcyWecTBARTACA ANA Yeneh NpiiceavBanna 3HaveHna nepemeHHoli, KoTopaa ABaserca LHS (left-hand-side) ccbinkoli, wan MoxXeT OCYUeCTBAATbCA ANA YeNeli W3B/eYeHVA ee 3Ha4eHMA, KOTOPOe ABAAeTCA RHS (right-hand- side) ccpinkon. LHS-ccuinkn aeasiotca peaynstaTom onepaunn npuceaneaHna. Mpnceausanus, caazaHHnle ¢ O6nacmsto eudumocmu, Moryt nponcKogHTe N60 ¢ NOMOLbIO ONepaynin =, AM6o nepegaver aprymeHtos (npncsansaHvem) napamerpam dyHKUWn. JavaScript Jauxox nepes ebinonHeHnem cHavana KOMNMWAMpyeT KOA, MH MOKA OH 3TO AeNaer, OH paa6neaer oneparopsl, nogo6Hble var a = 2; Ha ABa OTAeNbHEIX wara: 1. Mepebid, var a, uT06u1 oSbaBHTb ee O6acms eudumocmu, 370 BbINOAHAeTCA B CaMOM Havane, go vcronHeHina Koa. hlps:fgivwub com/azatiofyou-dont-knowjs-sublobimaster!scope%20%26%20closuresicht.md a0 20.08.2017 you-dont-know-js-rulcht.mdl al master - azaolyau-dont-knowej-ru ~ GitHub 2. Mloaxe, a = 2 mujeT nepemeHHyto (LHS-ccbinky) 4 nplicausaer eli sHa4eHe, ech HaxoAMT. 6a noncka ccbinox LHS 4 RHS HauMHatoTca B TekyWyer BbinonHsIoUelica OGnacmu eudumocmu w eCIM HYKHO (T.e. OHM He Hala 4TO UckaAH B Heli), OHM paboTAloT C x BoNee BbICOKMA anoxenHeimn O6racmamu audumocmu, ¢ oAHOH o6nacrelo (aTaKOM) 3a pa3, Muka YAeHTHguKaTOP, oka He AoGepytca fo roGansHolt (BepxHNli aT@X) M He OCTAHOBATCR, BHE 2aBCHMOCTU OT pesynbrara noncka. HesbinonvenHbie RHS-ccbinkw npuBops k BbIGpocy Referencetrror. HeabinosHeHHble LHS-ccbinkn NpvBOgaT k aBTOMaTHMUeckO!, HeRBHOCOSAaHHOl NepeMeHHoli c TAKUM UMeHeM (ec He BkmIOUeH “Crpornit pexum"), 60 K Referencetrror (ecan BkslONeH “Crpornii pexuM") > OrBerbI k TecTy function foo(a) { var b = a; return a + bs var ¢ = foo( 2); 1. Onpegennte ace LHS-noucku (x 3!) © = ..,a = 2 (HenBHoe npvcsaneanue napamerpy) Mb = .. 2. Onpegenute sce RHS-nonckn (ux 4!) foo(2. Mpo “Crporit pexum" cm. 3ece hlps:fgitnub com/azatiofyou-dont-knowjs-sublobimaster!scope%20%26%20closuresicht.md 1010 20.08.2017 you-dont-know-js-ru/ch2.mel al master - azaiolyau-dont-knowej-ru ~ GitHub [napa 2: Jlekcuueckaa o6facTb BUAZMMOCTU B rnase 1, mbi onpegennnu “o6nacts angumoct” Kak Ha6op npasua, KoTopsle peryanpytoT kak JeuxoK MoxXeT UcKaTb NepeMeHHylo No ee AMeHH HAeHTAOMKaTOpa M HaliTH ee AMG0 B Texyuyeri O6acmu eudumocmu, an6o 8 10601 13 anoxeHHtrx OBnacmed audumocmu, 8 KoTOpoH ona cogepxurcn, Ect age npeo6nagatowx Moqenn Toro, Kak paGoraer o6sacTs auquMmocTa. Mepsan 13 HIAK, 6eaycnosHo camas pacnpoctpalenHas, ucnombayeTcA HeOBbATHEIM 6ONbLUMHCTBOM A3bIKOB Nporpammmposatina. Ona HaabiBaeTca SleKcu4eckas O6s1aCT BYAMMOCTH Mi MbI M3y4KM e@ & aeranax. JIpyran Mopenb, KoTOpaa ace ele HCTIombayeTCA HeKOTOPBIMM AabIKaMM (TAKMMI KaK ckpunoebili Bash, Hexoropble pexumei @ Perl w1.f,), Haableaerca IMHaMMueckan O6nacTe Bmgumoctn. Avnammueckas o6acts suanMocTu paccmaTpuaaercs & npwnorxenin A. fl ynoMMHaio ee 3qecb TOMbKO 4TOGbI NOKAIaT KOHTPACT ¢ NeKCHYeCKOH OBacTblo AeVICTANA, KOTOpaR ABARETCA MOAebIO o6nactw angumoctn, ncnonbayemoi e JavaScript. > Bpema pa360pa Ha eKcembI Kak mui yxe o6cyannu 8 rage 1, nepsaa TpagnuvoHHan aaa paborbi crayqaptHoro KoMninnaTopa aabika Ha3biBaeTca pas6veHue Ha AekceMbI (lexing wan tokenizing). Ecau eb! npunomuwte, To Npouecc pasGveHna Ha NeKcembl aHanvanpyer CAMBONbI CTpOKH MCXOAHOrO Kosa M AaeT CemaHTiueckoe 3Ha4eHne seKceMaM Kak pesy/bTaT HeKOTOPOTO Mapciilra C COCTORHVIEM, 310 W ects Ta KOHYeNuMA, KOTOpaR NpegocTaBnseT OCHOBY NOKMMAHANA TO TaKoe NeKcHYECKAR o6nacTe BYANMOCTH UM OTKyAa NPONcXoAMT ee HaaBAHve, Onpenenas ee oruactu vepes camy ce6s, neKcnueckan O67aCTe BHAMMOCTA — 3TO OBNACTS evanMoctu, KoTOpaa OnpemeneHa BO BpeMa paa6opa Ha seKceMbI. VHbIMM CloBaMN, eKcHYECKAR o6nact evqnmoctn ocHoBaHa Ha TOM, re NepeMeHHble 4 Goku O6/AcTH BNAMMOCTH BbInA co3qaHbi BaMM BO BpeMA HanMcaHna vi TaKMM O6pazom (s OCHOBHOM) HaBe4HO 3apVKCMpoBaHbl Ha MomeHT, Kora MeKcayeckinit aHanvsaTop o6pabaTbiBan Bau KOA, Tpumevanue: Coacem ckopo MBI yaNaviM, YTO eCTb HekoTOpble CnocobbI OBMaliyTb /eKcHeckyto o6nact gelicrava, Tem caMbIM MeHAa ee Nocne Toro, Kak AeKcHYecKHii aHanuaaTop y>Ke NPOUeNcA No Hell, HO K HAM OTHOCATER HeoAOBpHTenbHO. CunTaeTcA AyMWel NpaKTHKOH O6pawarsca ¢ TeKcHMECKOI OBNACTHIO BYAMMOCTH KAK, NO CYTA ema C HNCTO eKCHMeCKOHi M ChegoBaTenbHO NonHOCTbIo OTHOCAUelicA K MOMeHTY HanHCaHina Koga no cBoeli Npupoae. Aavalire pacemotpum 3T0r Kop: function foo(a) { var b= a * 25 function bar(e) { console.log( a, b, ¢ )3 hlps:fgitwub com/azatiolyou-dont-knowjs-rublabimaster!scope%20%26%20closuresich2.md ve 20.08.2017 you-dont-know suleh2.md al master -azatiolyou-don-knowj-u Gib bar(b * 3)5 Foo( 2); // 2.412 B stom npnmepe Koga eCTb Tol BNOXeHHbIX OBacTH BNAMMOCTH. YAOSHO NpeaCTABnATs 3TH o6nacTH BMAMMOCTH Kak 30HbI OAHa BHYTPA Apyroit function foo(a) { 0 var b = a * 2; eo function bar } bar(b * 3); } foo( 2); // 2, 4, 12 Bona 1 sakniouaer 8 ce6e rnoBanbiyio O6aCTS BMAUMOCTH, y KOTOPOH ecTe BcerO CANH wgeHtnukatop: foo. Bona 2 saKniouaer 8 ce6e O6acTe BMAMMOCTH foo, KOTOpaR BknIO“aeT 8 cea TPH wgextndukaropa: a, bar ub. Bona 3 aakniouaer @ ceGe o6acTh BMANMOCTH bar MH ONa BkMIOUaeT B CeBA BCerO OAVH vaeHtuduKarop: « Bont! o6/actelt emauMocTn onpegensioTca Tem, fae Hanvicalb! 6noKn o6nacTH EMAnMocTH, KoTopbie NocieqoBarenbHo BNOKeHbI Ayr B Apyra. B cneAyoWlel raze, MbI OBcyAMM pazAMuHbIe eAMHMYbI O67ACTH BM_HMOCTH, a celiac RaBaliTe NpocTo AONYCTHM, MTO KaxkAaR >yHKYWA CO3AaeT HoByto 30Hy o6/acTH BuquMocTA Bona ANA bar NOAHOCTbIO COMePKMTCA B 3OHE AMA Foo, NOTOMY UTO (M TOABKO NOsTOMY) 3TO TO MecTo, KoTOpOe MbI BbIGPANH ANA CosAAHUA hyHKYMN bar. BaMeTbTe, 470 37H BAOKEHHBIE 3OHbI BIOXEHB! OAHOSHAYHO M 4ETKO, MbI He rosopinM celiac O kpyrosbix quarpammax 3vinepa—Benna, rie 30HbI MoryT NepeceKaTe rpaHinlibl. VHbIMA cnoBaMM, Hi ogHa 30Ha aa yHKUM He MoxXeT OAHOBpeMeHHO CyU\ecTBOBaTe (YACTHUHO) BHYTPH ABYX ApyIx 30H BHEUINMX O6/aCTeh BMAMMOCT, KaK KM HA CAHA dYHKUMA He MOXET YaCTAYHO 6bIT BHYTPH KaxAON M3 ABYX POAUTENBCKMX dYHKUMAX >Noncku hilps:i/gitwub.convazatialyou-cont-know sulblobimasteriscope%20%26%20closuresich2.md 218 20.08.2017 you-dont-know-js-ru/ch2.mel al master - azaiolyau-dont-knowej-ru ~ GitHub Crpyktypa 4 oTHOCHTenbHOe NonOXxeHMe 3THX 30H OB/aCTeli BUAVMOCTH NOAHOCTBIO oBpaciaet Aeuxky Bce MeCTa, B KOTOpbIE EMy HYKHO 3arMaHyTb, UTOGbI HaliTH HaeHTHAuKATOp. B abiwienpusegentom Koge, JeuXoK abinonHaer onepatop console. log(..) M WAeT MCKaTb TPH NepeMmeHHlx a, b, Wc, Ha KOTOpBIe eCTh CcbinKH. CHavana OH Haunnaer c CaMOli BHYTPeHHel 2041 oBaactu angumoctn, o6/acTH BMAUMOCTH dyHKUW bar(..).OH He HaligeT TaM a, NloaToMy noliger Ha yposeHb abiule, Hapyky K cnenyloujelt Gnwxaliuiel 30He o6nacTu BMAMMOCTH, OBnacTH BUANMOCTH foo(...). TaM OH HakoHeY Haliger a, n NosTOMy vcnonbayer sty a, To Ke CaMOe M AMA b. A.sor c of Haier sHyTpM bar(..) Ecan 661 c 6biNa 4 BHYTPM bar(..), A BHYTPH foo(...), TO ONepaTop console. 1og(..) Haullen Micnionb3oBan Ty, 4TO 8 bar(..), HAKOrAa He Tporan Takyto 2Ke M3 Fo0(..). Tock 8 o6nactn eMguMoctu npeKpaujaercs Kak To/bKO OH HaXOAMT Nepsoe cosnageHne. O{HO WTO Ke MMA HAeHTNduKaTOpA MOXeT ObiTb ykazaHO B HECKOMBKK COAX BAOKEHHBIX O6acTel BvAMMoCTH, 4TO HaabiBaeTcA “saTeHeHne (shadowing)" (sHyTPeHHMi ujeHTHdnKaTop “saTeHReT (shadows)" sHewHui). Hezasucumo oT 3aTeHeHmA, NOMCK B O6AacTM BYAMMOCTH BCerfa HaNMHaeTCA C camoii BHYTpeHHelt O6nacTH sMANMOCTH, UCTORHAIOUIeliCA & AaHHbIZi MOMeHT 4 pa6oTaeT TaKMM nyTem no HanpasjeHiio Hapyxky/sBepx noKa He HaligeTca Nepsoe coBnageHne v Torna octanasanpaerca. Npumeuanue: To6anbible nepemeHHble Take aBTOMATMUeCKH ABARIOTCA CBOMCTBAMK rnoGansHoro ob veka (window 8 Gpay3epax v1 T.n.), NOSTOMy MOXHO CCbiNaTeCA Ha rnoBanbHyio TepemeHiyo He NpsMO Mo ee NeKCHYECKOMY HMeHIK, a BMECTO 9TOTO KOCBEHHO MComb30BATS cebinky Ha cBOVicTBO rnoGanbHoro ObpekTa. window.a 3a Textinka AaeT AOCTyN k roBanbHOl NepeMeHHo!, KoTOpaR B NPOTHBHOM cryuae 6biNa 6b Hegoctynia 13-3a saTeHeHns, OgHako, HernoGanbHble 3aTeHeHHbIe NepeMeHHbie He MOryT 6bITb Aoctynti He saxHo omkyéa ebiabiBaeTcn yHKLMA WM fake Kak OHa BbI3bIBAeTCA, ee NeKcHUeckan OBAACTS BAMMOCTA ONpepeneHa TOMBKO Tem, Fe dYHKUMA Gbina OBbABTEHA. Mpouecc noncka 8 nekcnueckoii o6acTH BYAMMOCTM NpMMeHAeTCA MosbKO K MAeHTHOHKATOpaM Nepeoro Knacca, TaKM Kak a, b Hc. ECAN y BAC @CTh CCbINKa Ha foo. bar. baz B CTPOKE KOAA, NONCK B aeKcnueckoli o6actn 6yaet NPHMeHeH UTO6bI HalTH UAeHTAdMKaTOP Foo, HO KaK TONBKO OH HaxoAMT 3TY NepemeHHyto, eMy Ha CMeHY npAxoasT npasina poctyna k cBoMicTsaM O6veKTa, UTOGbI paspeuinTs umeHa cBolcTs bar 1 baz, COOTBETCTBEHHO, > O6manHbiBaem Nekcnueckyto O6sacTb BUAMMOCTU Ecan nexcnueckan o67acTe BYAMMOCTH ONpeAeNAeTCA TOMbKO TeM, Ae OBBABNEHA SyHKUMA, 4TO UeANKOM BO B/ACTH MOMeHTa HanMcaHia Koa, KaKOli MO>XeT ObITb BOSMOKHBIM NyTe "HaMeHHTE” (Te, o6manyte) nekcnueckyto o6acTb 80 BpeMa BbINOAHeHHA? B JavaScript ect aga Takix Mexanvama. K HAM 060MM OAMHaKoBO HeoAobpHTenbHo OTHOCATCA 8 UinpoKom coobujectBe Kak K MOXMM NpakrviKaM ucnionbsoBaHHA Koga. Ho TANMUHbIe apryMeHTb! hlps:fgitwub com/azatiolyou-dont-knowjs-rublabimaster!scope%20%26%20closuresich2.md 318 20.08.2017 you-dont-know-js-ru/ch2.mel al master - azaiolyau-dont-knowej-ru ~ GitHub NPOTHE Hx OBbI4HO He BNAAT CaMOrO raBHoro: OBMaH NeKcMUeCKOA OBacTH BNANMOCTH BeAET k Gonee xyquiei npovssoautenbHoctn. Nepeg Tem kak # o6bacHio npo6remy c npowaBoguTenbHocTbto, Bcé >ke, AaBaliTe BarnAHeM Ha TO, kak pa6orator 37H ga Mexanviama ?eval oyHkuna eval(..) 8 JavaScript 6eper crpoxy Kak apryMeHT 4 MHTepnpeTHpyeT conepxHMoe CTpokii Kak ECan 6bI 3T0 6bIN KOA, HANHCaHHbIii B 2TOM TouKe Nporpammtl. JpyrnMi cnoBaMM, BbI MoxeTe nporpaMMHO reHepnpoBaTe KOA BHYTPA Baluero COBCTBEHHOTO KOfa Vi 3anycKaTb creHepuporaHibilt KoA Kak eciM 6bi OH 6bin TaM B peMA HanHcaHua Koza. Mpn suiuncnenin eval(..) 8 TaKOM CBeTe, AOMKHO GbITb ACHO Kak eval(..) NO3soNAeT MoanpuuMposate oKpykeHine NeKcu4ecKol O6MACTH BAAMMOCTH OBMaHbIBAR HM NPUTBOPARC., STO 3TOT KoA 6bin TyT BCé BpEMA Ha nocneayrounx cTpokax Koga nocie Toro, kak BbINOAHeHA eval(..), AewxoK He "y3HaeT” wav He 'n03a6OTMTCR" 0 TOM, YTO NpeAbIAYWIMH KoA, © KOTOPOM MAeT ped, BbIN AMHAMAYECKH uitTepnpeTaposad 4 TakUM 06pa30M UIMeHIMA OKpyXxeHHNe MeKcHeckolh OB 1acTH BuANMOCTH. JewXKOK NpOCTO BbINOAHMT CBOM NONCKH No HeKcMYECKOH O6ACTH BHAMMOCTA KaK OH O6bI4HO 3To genaer. Mpegcrasre creayrownl Kon: function foo(str, a) { eval( str )3 // o6mai console. log( a, b ); var b = foo( “var b o1)3 1,3 Crpoka “var b = 3;" uiTepnperupyerca B TouKe BbI30B eval(..), Kak 6yATO 2TOT Kog 6biN TyT acerga. Mockonbky 3TOT Ko O6BABNAET HoRyIO NepeMeHHyto b, OH MaMeHseT CyLYeCTEYIOLIy!O seKcnueckylo O6/1acTe foo(..). PakTMYeCkH, Kak 6biN0 ykazaHO BbilUe, STOT Kf Ha CaMOM Aleve coaqaet nepemeniyio b BHyTp foo(..), KOTOpaR 3aTeHAeT b, KOTOpaA Gbina OBbABTeHA BO BHeWHeM (rao6anbHo!) oBnacTA BMAHMOCTH. Korga nponcxogur Bbi308 console. 1og(..), OH HaXOgMT Ha, Hb B OGNACTH BN_AMOCTH Foo(. Hukorga He HaligeT BHeUIHiOIO b, [lo 3ToH NpHunHe, MBI HaneuaTaem “1, 3" emecTo "1, 2" kak 3TO 6bino 6b B O6bIUHOM cryuae Tpumeyanue: B stom npumepe Ana npoctotsi crpoka "kopa”, KoTOpyto MbI Nepesann, 6bina oukcwposaHHbim A“Tepanom. Ho oHa erko MoxeT 6biTb Co3zqaHa NporpaMMHo CoeAMHeHHeM cuMBonog amecte Ha OcHoRe /loruku Bale nporpaMMbl. eval(..) O6bINHO UcnonbayeTcA ANA AvHaMMUeckn cosjaHHoro Kopa, NOCKOAbKy AUHAMMUecKoe BbINUCHeHNe No cyulecTay CTaTneckoro koja ¥3 CTPOKOBOTO AMTepana He AaeT HAKAKOTO PeanbHoro NpenmywjecTaa nepeA, Npoctsim HANNCaHveM sTOro Kofla HanpAMyto. hlps:fgitwub com/azatiofyou-dont-knowjs-sublabimaster!scope%20%26%20closuresich2.md 48 20.08.2017 you-dont-knowje-ueh2.md al maser azaliofyou-dont-know eu Hub Mo ymMonyannie, ecav crpoka Koga, KoTOpyto BbINOAHAeT eval(..), CoRePXUT OAHO NAM Gonee OGbaBneHni (nepemeHHeIx win dyHK\Mi), Torga sTO AelicTBMe MeHAeT CyUlecTByIOUIy!O AeKcuueckylo O6/aCTe BMAVMOCTH, 8 KOTOPOH pacnonaraeTca eval (..). Textnuecks, eval(..) MO>XeT 6biTb 8bi38aHa "HesBHO", NyTeM pagAM4HbIx TpIOKoB (sHe HaWwero o6cyxgeHnA 3nect), KOTOpbIe NPUBOAAT K TOMY, UTO Ola BMECTO 3TOFO 3anycKaeTCA B KOHTEKCTE rno6anbHolk O61acTH BYANMOCTH, TaKMM O6pa30M MeHss ee. Ho B MOGOM caytae, eval(..) MOET B BPEMA VCTOMHEHIMA MeHATS eKcHYECKyio OBsaCTS BMAMMOCTH, OpeAeNeHHyIO Ha MOMEHT Hanucanis Kona. Npumevanue: Korga eval(..) Mcnonbayerca 8 nporpamme, paGoTalouleli 8 cTporom pexuMe, oHa paGoraer co cBoeli coBcTaeHHON NeKcuueckolt O6sACTBIO BUAVMOCTY, TO O3HaYaeT, YTO OBbaBNeHMA, CaenaHHble BHYTpH eval(), He OMeHAIOT OKpy>KaloUlyto OBsacTb BMANMOCTH. function foo(str) { use strict”; eval( str ); console.log( a); // ReferenceError: a is not defined foo( “var a = 2" ); Ects apyrne cpeactea e JavaScript, KoTopbie MOUTH paBHOCUAbHbI NO sh>exty BbI30BaM eval (..). setTimeout(..) M setInterval(..), KOTOpbIe Mozym NPMHMMATE CTPOKy KaK cBoli Nepebili apryMeHT, Comep»xNMOE KOTOPO! esMucnnercA KAK KOA AKHAMMMECKM CreHepHpoBaHHO oyrikymn. 370 crapas, yHachenoBanHan >yHKUWOHaNbHOCTS M AaHbiM-AaBHo ycrapeauias, He aenaiire Tak! Korctpyktop dyHKUMM new Function(..) aHanorm4Ho NpuHuMaer cTpoky Kona & cB0em nocneqHeM aprymente, uTo6bI NpespatuTb e€ B ANHAMMYeCKH CreHepmpOBAHHyo GYHKUWO (nepsbie aprymenTs1, ecan ykazaHl, ABAAIOTCA MMeHOBAHHBIMM NapaMeTpaMi ANA HOBO oynikynn). Taxon cmiTaKcnc KOHCTpyKTopa hyHKUMN HeMHOro GesonacHee, YeM eval(..), HO ero Tawxe cepyer va6eraTs & BaWieM KOpe. Bapmanol ucnonbsoBaHiia aMHaMMYeckH creHepHposaHHoro Koga BHYTPH BalLielt nporpaMMbi Kpaliie peak, nockonbky CHYDKeHMe NPOMSBOgMTENHOCTH NOTH HMKKOrga He CTOMT Tako B03MOKHOCTA owith Ewe ova Bo3MoxHOCTs B JavaScript, K KOTOpO Heogo6puTenbHO OTHOCATCA (n KOTOpaA Ceriuac ycrapenal), KoTopan O6MaHbiBaeT neKcHeckyio O6/ACTS BHAMMOCTH, STO KHOMEBOE COBO with. Ectb MHoro NlogxOAAUMx nyTelt, YTO6BI OBBACHMTS MTO TakOe with, HO A BbIGepy OBbACHEHME C TOUKM 3peHIMA Toro, Kak OHO B3aMMOpeliCTByeT M BAMAET Ha NeKCHMECKyio O6acTe BAAMMOCTH. with O6bIUHO ONMCbIBaIOT KaK COKPALeHNe AIA BLINOAHEHNA MHOXKECTBEHHBIX CCbINOK Ha CBOlicTBA o6vekta 6eanoBTopeHina Kaxkablli pas Ccbinki Ha CaM OBBEKT. Hanpumep: hlps:fgitwub com/azatiolyou-dont-knowjs-rublabimaster!scope%20%26%20closuresich2.md 58 20.08.2017 you-dont-know-js-ru/ch2.mel al master - azaiolyau-dont-knowej-ru ~ GitHub 3 d // Gonee “cKysHo" noBtopatb "obj" obj.a = 25 obj.b = 3; obj.c // “nerkoe" coxpauenne with (obj) { a=3; b= 4; co 55 OaHaKo, 3qece npoucxogut HeuTo Bonbwwee, YeM npocrTo yAoBHOE CoKpauenne ana Aocryna K ceoiicream o6vekra. Mpeacrassre: function foo(obj) { with (obj) ( a=25 foot o1 )3 console.log( o1-a ); // 2 Foo( 02 )5 console. log( 02.a ); // undefined console.log( a); // 2 —Ync, yrexuan rnobansyan nepementan! B stom npumepe Koga, coaqatorca aga O6beKTA o1 1 02. ¥ OAHOTO ECT CBOIICTBO a, ay Apyroro — Her. ©yHKuMA Foo(. .)GepeT CcbiMKy Ha OBEKT obj KaK ApryMeHT, a 3aTeM BbIBbIBAET with (obj) { <+ } €3TOl ccbinkoli. BHyTpH 620Ka with MbI AenaeM, Kak HaM NpegcTaenserca, O6bINHYIO seKcMueckyto CCbIIKy Ha 2, Ha caMoM gene LHS-ccbiaKy (cM. ragy 1), uTo6bI NpcBOUTs elt aHaueHne 2. Kora Mbi nepegaem 01, npicsoeHie a = 2 HaxcAMT cBolicTao o1.a M npuceanBaeT emy ahavenive 2, YTO Hallino cBoe OTpaxeHNe B NocHeAyioUeM oNeparope console. 1og(01.a). OAHaKO, hlps:fgitwub com/azatiofyou-dont-knowjs-sublabimaster!scope%20%26%20closuresich2.md ae

You might also like