Koks yra „JavaScript“ savęs vykdymo funkcijos tikslas?

„JavaScript“, kai norite naudoti:

 (function(){ //Bunch of code... })(); 

aukščiau:

 //Bunch of code... 
356
nustatė ej. 26 Vas 2009-02-26 23:53 '09 11:53 AM 2009-02-26 23:53
@ 17 atsakymų

Viskas apie kintamą plotą. Kintamieji, deklaruoti savikontrolės funkcijoje, pagal nutylėjimą yra prieinami tik kodui savarankiškai įvesti funkciją. Tai leidžia jums rašyti kodą neatsižvelgiant į tai, kaip kintamieji vadinami kituose „JavaScript“ kodo blokuose.

Pavyzdžiui:

 (function(){ var foo = 3; alert(foo); })(); alert(foo); 

Iš pradžių pasirodys įspėjimas „3“, o paskui - kitas įspėjimas, nes foo nėra apibrėžta.

345
26 февр. Atsakyti Ken Browning 26 vasario mėn 2009-02-26 23:57 '09, 23:57 2009-02-26 23:57

Paprastas. Labai normali išvaizda, jos beveik paguodos:

 var userName = "Sean"; console.log(name()); function name() { return userName; } 

Tačiau. Ką daryti, jei į savo puslapį įtrauksiu tikrai patogią „JavaScript“ biblioteką, kuri išversta pažangius simbolius į jų reprezentacijas pagrindiniame lygmenyje?

Palaukite ... ką?

Aš turiu galvoje. Jei kas nors įgyja tam tikro dėmesio (pvz., Prancūzų ar ispanų), bet man reikia tik „anglų“ simbolių? Mano programoje? Na ... ispanų "n ~" ir prancūzų "e /" simboliai (tam naudoju du simbolius, bet jūs tikriausiai galite padaryti psichinį šuolį simboliu, kuris atspindi akcentus), šie simboliai gali būti išversti į pagrindinius simbolius " n 'ir' e '.

Taigi, kas nors geras žmogus parašė išsamų simbolių konverterį, kurį galiu įtraukti į savo svetainę ... įjungiu.

Viena problema: ji turi funkciją, pavadintą „vardas“, kaip ir mano funkcija.

Tai vadinama susidūrimu. Turime dvi funkcijas, deklaruotas tame pačiame domene su tuo pačiu pavadinimu. Mes norime to išvengti.

Taigi, mes turime kažkaip padengti mūsų kodą.

Vienintelis būdas naudoti „JavaScript“ taikymo kodą yra apvynioti jį į funkciją:

 function main() { // We are now in our own sound-proofed room and the // character-converter libarary name() function can exist at the // same time as ours. var userName = "Sean"; console.log(name()); function name() { return userName; } } 

Tai gali išspręsti mūsų problemą. Dabar viskas uždaryta ir prieinama tik iš mūsų atidarymo ir uždarymo petnešų.

Mes turime funkciją funkcijoje ..., kuri atrodo keista, bet visiškai teisėta.

Tik viena problema. Mūsų kodas neveikia. Mūsų userName kintamasis niekada nesikartoja konsolėje!

Šią problemą galime išspręsti pridedant skambutį į mūsų funkciją po mūsų esamų kodų blokų ...

border=0
 function main() { // We are now in our own sound-proofed room and the // character-converter libarary name() function can exist at the // same time as ours. var userName = "Sean"; console.log(name()); function name() { return userName; } } main(); 

Arba anksčiau!

 main(); function main() { // We are now in our own sound-proofed room and the // character-converter libarary name() function can exist at the // same time as ours. var userName = "Sean"; console.log(name()); function name() { return userName; } } 

Antrasis susirūpinimas yra toks: kokie yra tikimybės, kad pavadinimas „pagrindinis“ dar nebuvo naudojamas? ... taip labai, labai subtilus.

Mums reikia daugiau taškų. Ir kažkaip automatiškai vykdoma mūsų pagrindinė () funkcija.

Dabar mes pasiekiame automatinio vykdymo (ar savarankiško, savarankiško) funkcijas.

(() {}) ();

Sintaksė yra nepatogu kaip nuodėmė. Tačiau jis veikia.

Kai baigsite funkcijų apibrėžimą skliausteliuose ir įtraukiate parametrų sąrašą (kitas rinkinys arba skliausteliai!), Jis veikia kaip funkcijų skambutis.

Taigi, peržiūrėkime savo kodą dar kartą su savarankiška sintakse:

 (function main() { var userName = "Sean"; console.log(name()); function name() { return userName; } } )(); 

Taigi, daugumoje skaitytų pamokų, dabar jums bus bombarduojamas terminas „anoniminis savęs įgyvendinimas“ arba kažkas panašaus.

Po daugelio metų profesinio tobulėjimo raginu jus pavadinti kiekvieną funkciją, kurią rašote derinimo tikslais.

Kai kažkas negerai (ir ji bus), patikrinsite grįžimo liniją naršyklėje. Visuomet lengviau susiaurinti problemas, susijusias su kodu, kai įrašai kamino pėdsakuose turi vardus!

Labai ilgai, ir tikiuosi, kad tai padės!

68
09 мая '15 в 11:13 2015-05-09 11:13 atsakė Sean Holdenui gegužės 09-15 dienomis 11:13 2015-05-09 11:13

Savęs iškvietimas (taip pat žinomas kaip automatinis skambutis), kai funkcija iš karto atlieka jo apibrėžimą. Tai yra pagrindinis šablonas ir yra daugelio kitų „JavaScript“ šablonų kūrimo pagrindas.

Esu puikus gerbėjas :), nes:

  • Jis saugo minimalų kodą.
  • Jis suteikia elgesio atskyrimą su atstovavimu.
  • Jis suteikia uždarymo, kuris užkerta kelią vardinių konfliktų.

Neįprastai - (Kodėl turėtumėte pasakyti, kad tai gerai?)

  • Apie funkcijos apibrėžimą ir įgyvendinimą vienu metu.
  • Galbūt ši savarankiškai vykdanti funkcija grąžins vertę ir perduos funkciją kaip parametrą kitai funkcijai.
  • Tai gera, kad būtų galima kapsuluoti.
  • Tai taip pat tinka peržiūrėti vietovę.
  • Taip, visus „.js“ failus galite įdėti į savarankiškai vykdančią funkciją ir užkirsti kelią pasaulinės vardų erdvės taršai.))

Skaitykite daugiau čia .

34
19 мая '10 в 18:39 2010-05-19 18:39 Atsakymą įteikė MA Hossain Tonu gegužės 19 d. 10 val. 18:39 2010-05-19 18:39

Vardų sritis „JavaScript“ sritys yra funkcionalios.

19
26 февр. Christoph paskelbė vasario 26 dieną 2009-02-26 23:56 '09, 23:56, 2009-02-26 23:56

Negaliu patikėti, kad nė vienas iš atsakymų nenurodo numanomų pasaulinių kintamųjų.

(function(){})() konstrukcija neapsaugo nuo numanomų pasaulinių kintamųjų, kurie man kelia nerimą, žr. Http://yuiblog.com/blog/2006/06/01/global-domination/

Iš esmės funkcinis blokas užtikrina, kad visi jūsų apibrėžti priklausomi „pasauliniai variantai“ apsiriboja jūsų programa, jie neapsaugo jus nuo netiesioginių pasaulių apibrėžimo. JSHint ar pan. Gali suteikti apsaugos gaires šiam elgesiui.

Koncentruota sintaksė var App = {} suteikia panašų apsaugos lygį ir gali būti įtraukta į funkcijų bloką, kai jis yra „viešuose“ puslapiuose. (žr. „ Ember.js“ arba „ SproutCore “ realiam pasauliui, jei naudojate šią konstrukciją naudojančių bibliotekų pavyzdžius)

Kalbant apie private savybes, jos greičiausiai bus perkainojamos, jei nesukursite viešai prieinamos struktūros ar bibliotekos, bet jei jas reikia įgyvendinti, „ Douglas Crockford“ turi keletą gerų idėjų.

12
13 апр. David W. Keith atsakymas balandžio 13 d 2012-04-13 08:42 '12 8:42 2012-04-13 08:42

Ar yra parametras, o „Kodas puokštė“ grąžina funkciją?

 var a = function(x) { return function() { document.write(x); } }(something); 

Uždarymas. Kieno reikšmę naudoja funkcija, priskirta a . something gali turėti tam tikrą kintamąją vertę (kilpa) ir kiekvieną kartą, kai a yra nauja funkcija.

7
27 февр. atsakymas pateikiamas 27 vasario mėn. 2009-02-27 00:03 '09 - 0:03 2009-02-27 00:03

Galbūt izoliacijos sritis. Taigi, funkcijų deklaracijos viduje esantys kintamieji neteršia išorinės vardų erdvės.

Žinoma, per pusę JS įgyvendinimo, jie vis dar bus ten.

6
26 февр. atsakymas pateikiamas chaosas 26 vasaris. 2009-02-26 23:57 '09, 23:57 2009-02-26 23:57

Tai nuostabus straipsnis, paaiškinantis visa tai ir kodėl tai yra gera programavimo praktika: http://markdalgleish.com/2011/03/self-executing-anonymous-functions/

6
03 дек. atsakymas pateikiamas 03 d. 2017-12-03 05:26 '17 at 5:26 am 2017-12-03 05:26

Gali būti naudingas pavyzdys, kaip anoniminė iškvietimo funkcija gali būti naudinga.

 for( var i = 0; i < 10; i++ ) { setTimeout(function(){ console.log(i) }) } 

Išėjimas: 10, 10, 10, 10, 10...

 for( var i = 0; i < 10; i++ ) { (function(num){ setTimeout(function(){ console.log(num) }) })(i) } 

Išėjimas: 0, 1, 2, 3, 4...

5
19 нояб. atsakymas pateikiamas sg.cc lapkritis 19 2015-11-19 23:55 '15, 11:55 val. 2015-11-19 23:55

Aš perskaičiau visus atsakymus, trūksta kažko labai svarbaus , PIRKTI. Yra dvi pagrindinės priežastys, kodėl man reikia savarankiškai pasirašytų anoniminių funkcijų, arba geriau, kai išreikštas funkcijų išraiška (IIFE) :

  • Geresnis vardų valdymas (be vardų užteršimo → JS modulis)
  • Uždarymas (privačios klasės narių modeliavimas, kaip žinoma iš PLO)

Pirmasis yra labai gerai paaiškintas. Antrą kartą, prašome išnagrinėti šį pavyzdį:

 var MyClosureObject = (function (){ var MyName = 'Michael Jackson RIP'; return { getMyName: function () { return MyName;}, setMyName: function (name) { MyName = name} } }()); 

Dėmesio 1: nenurodome funkcijos „ MyClosureObject , dar labiau paskambinus šią funkciją . Atminkite () paskutinėje eilutėje.

2 pastaba: tai, ką papildomai reikia žinoti apie „Javascript“ funkcijas, yra tai, kad vidinės funkcijos suteikia prieigą prie parametrų ir kintamų funkcijų, jos yra apibrėžtos viduje.

Pabandykime keletą eksperimentų:

MyName galiu gauti su getMyName , ir jis veikia:

  console.log(MyClosureObject.getMyName()); // Michael Jackson RIP 

Šis paprastas metodas neveikia:

 console.log(MyClosureObject.MyName); // undefined 

Bet galiu nustatyti kitą pavadinimą ir gauti tikėtiną rezultatą:

 MyClosureObject.setMyName('George Michael RIP'); console.log(MyClosureObject.getMyName()); // George Michael RIP 

Redaguoti: pirmiau pateiktame pavyzdyje „ MyClosureObject skirtas naudoti be new prefikso, todėl pagal susitarimą jis neturėtų būti kapitalizuojamas.

3
05 дек. atsakymas pateikiamas Lonely 05 dec. 2017-12-05 15:26 '17, 15:26 pm 2017-12-05 15:26

Vienas skirtumas yra tas, kad kintamieji, kuriuos deklaruojate funkcijoje, yra vietiniai, todėl jie išnyksta, kai išeinate iš funkcijos ir neprieštaraujate kituose kituose kintamuosiuose.

3
26 февр. Guffa atsakymas, pateiktas vasario 26 d 2009-02-26 23:58 '09, 11:58 val. 2009-02-26 23:58

Funkcija „self“, naudojama „javascript“:

Savęs paleidimo frazė automatiškai pradeda veikti be skambučio. Savo pradžios raiška vadinama iš karto po jos sukūrimo. Tai dažniausiai naudojama siekiant užkirsti kelią konfliktų įvardijimui, taip pat užtikrinti, kad jie būtų kapsuluojami. Kintamieji arba deklaruoti objektai nėra prieinami už šios funkcijos. Kad būtų išvengta minimalizavimo problemų (failo pavadinimas.min), visada naudokite savęs paleidimo funkciją.

2
20 окт. Spalio 20 d. Atsakymą pateikia Kishor Vitekar . 2015-10-20 16:02 '15, 4:02 pm 2015-10-20 16:02

Kadangi „Javascript“ funkcijos yra pirmos klasės objektai, apibrėžiantys tokiu būdu, jis efektyviai apibrėžia „klasę“, labai panašią į C + + arba C #.

Ši funkcija gali nustatyti vietinius kintamuosius ir turėti joje funkcijas. Vidinės funkcijos (efektyvios instancijos metodai) turės prieigą prie vietinių kintamųjų (iš tikrųjų egzempliorių kintamųjų), tačiau jos bus atskirtos nuo likusio scenarijaus.

1
26 февр. James Curran atsakymas, pateiktas vasario 26 d 2009-02-26 23:57 '09, 23:57 2009-02-26 23:57

Savęs vykdymo funkcija naudojama kintamojo apimties kontrolei.

Kintamojo apimtis yra jūsų programos sritis, kurioje ji yra apibrėžta.

Pasaulinis kintamasis turi pasaulinį mastą; ji yra apibrėžta visur jūsų „JavaScript“ kode ir gali būti pasiekiama bet kurioje scenarijaus vietoje net ir jūsų funkcijose. Kita vertus, funkcijos, deklaruotos funkcijos viduje, yra apibrėžtos tik funkcijos kūno viduje. Jie yra vietiniai kintamieji, turi vietinę apimtį ir gali būti prieinami tik šioje funkcijoje. Funkciniai parametrai taip pat laikomi vietiniais kintamaisiais ir yra apibrėžti tik funkcijų korpuse.

Kaip parodyta žemiau, galite pasiekti savo funkcijoje esantį globalizuotiną kintamąjį ir taip pat atkreipti dėmesį, kad funkcijų kūno vietoje vietinis kintamasis turi pirmenybę pasaulinio kintamojo, turinčio tą patį pavadinimą, atžvilgiu.

 var globalvar = "globalvar"; // this var can be accessed anywhere within the script function scope() { alert(globalvar); localvar = "localvar" //can only be accessed within the function scope } scope(); 

Taigi apskritai savarankiškai skambinantis funkcija leidžia jums rašyti kodą neatsižvelgiant į tai, kaip kintamieji yra vadinami kituose „JavaScript“ kodo blokuose.

1
24 апр. Atsakymas, kurį pateikė Adeojo Emmanuel IMM 24 Bal 2018-04-24 13:14 '18, 14:14 pm 2018-04-24 13:14

(function(){ var foo = { name: 'bob' }; console.log(foo.name); // bob })(); console.log(foo.name); // Reference error

Tiesą sakant, pirmiau minėta funkcija bus laikoma funkcijos be vardo išraiška.

Pagrindinė užduoties uždarymo ir atidarymo skliausteliuose funkcija yra išvengti pasaulinės erdvės taršos.

Kintamieji ir funkcijos funkcijos išraiška tapo privačiais (t. Y. Jie nebus prieinami už funkcijos ribų).

1
31 марта '17 в 13:14 2017-03-31 13:14 Atsakymas duotas Madhankumar'ui kovo 31 d. 17, 13:14 2017-03-31 13:14

Atrodo, kad į šį klausimą atsakoma, viskas yra pasirengusi, bet vis tiek atsiųsiu savo informaciją.

Žinau, kada norėčiau naudoti spontaniškas funkcijas.

 var myObject = { childObject: new function(){ // bunch of code }, objVar1: <value>, objVar2: <value> } 

Funkcija leidžia man naudoti papildomą kodą, norint apibrėžti „ChildObjects“ atributus ir savybes švaresniam kodui, pavyzdžiui, nustatyti dažniausiai naudojamus kintamuosius arba atlikti matematines lygtis; Oi! arba klaidų tikrinimas. vietoj sintaksės, skirtos kurti įdėtus objektus ...

 object: { childObject: { childObject: {<value>, <value>, <value>} }, objVar1: <value>, objVar2: <value> } 

Kodavimas paprastai turi daug neaiškių būdų, kaip padaryti daugelį tų pačių dalykų, verčiantis užduoti klausimą: „Kodėl nerimauti?“ Tačiau vis dar atsiranda naujų situacijų, kuriose nebegali pasikliauti vien tik pagrindiniais direktoriais.

0
18 дек. Atsakymas, kurį pateikė Garrett Dec 18 2016-12-18 06:26 '16 at 6:26 am 2016-12-18 06:26

IIRC leidžia sukurti privačias savybes ir metodus.

-2
26 февр. Ólafur Waage atsakymas 26 vasaris 2009-02-26 23:57 '09, 23:57 2009-02-26 23:57