Kas yra šio „JavaScript“ idiomo pagrindas: var self = this?

WebKit HTML 5 SQL saugojimo pastabų demonstravimo šaltinyje mačiau šiuos dalykus:

 function Note() { var self = this; var note = document.createElement('div'); note.className = 'note'; note.addEventListener('mousedown', function(e) { return self.onMouseDown(e) }, false); note.addEventListener('click', function() { return self.onNoteClick() }, false); this.note = note; // ... } 

Autorius „I“ kai kuriose vietose naudoja (funkcijų kūną), ir kitose vietose (funkcijų kūnuose, apibrėžtuose metodų argumentų sąraše). Kas vyksta Dabar, kai pastebėjau vieną kartą, ar aš pradėsiu jį pamatyti visur?

333
07 июня '09 в 17:59 2009-06-07 17:59 Thomas L Holaday paklausė birželio 07'09 , 17:59 2009-06-07 17:59
@ 10 atsakymų

Žr. Šį straipsnį alistapart.com

self naudojamasi palaikant nuorodą į originalą, netgi pasikeitus kontekstui. Tai yra metodas, dažnai naudojamas renginių tvarkytojams (ypač uždarymo metu).

409
07 июня '09 в 18:01 2009-06-07 18:01 Atsakymą davė Jonathanas Finglandas birželio 07 d. 09:18 val. 2009-06-07 18:01

Manau, kad kintamojo „savęs“ pavadinimas neturėtų būti naudojamas šiuo būdu, nes šiuolaikinės naršyklės suteikia visuotinį kintamąjį, rodantį pasaulinį objektą arba įprastą >

border=0

Norėdami išvengti painiavos ir galimų konfliktų, galite rašyti var thiz = this arba var that = this .

92
24 сент. Duan Yao atsakymas rugsėjo 24 d. 2013-09-24 07:46 '13, 7:46, 2013-09-24 07:46

Taip, jūs pamatysite jį visur. Dažnai tai yra that = this; .

Pažiūrėkite, kaip self naudoja vidinės funkcijos, kurias sukelia įvykiai? Jie turės savo kontekstą, taigi self naudojamasi šiam įrašymui, kuris buvo pateiktas Note() .

self priežastis vis dar yra prieinama funkcijoms, nors jos gali būti įvykdytos tik baigus Note() funkciją, yra tai, kad vidinės funkcijos gauna išorinės funkcijos kontekstą dėl uždarymo .

34
07 июня '09 в 18:03 2009-06-07 18:03 Atsakymą pateikė Nosredna birželio 07 d. , 09:18 , 2009-06-07 18:03

Taip pat reikėtų pažymėti, kad yra alternatyvus tarpinis modelis, leidžiantis patvirtinti nuorodą į originalą, jei jums nepatinka idiomas var self = this .

Kadangi funkciją galima pavadinti tam tikru kontekstu, naudodami function.apply arba function.call , galite rašyti įvynioklį, kuris grąžina funkciją, kuri skambina jūsų funkciją taikydama arba call nurodytu kontekstu. Žr. JQuery proxy funkciją šiam modeliui įgyvendinti. Čia pateikiamas jo naudojimo pavyzdys:

var wrappedFunc = $.proxy(this.myFunc, this);

wrappedFunc gali būti vadinamas ir turėsite this versiją kaip kontekstą.

28
22 нояб. atsakymas duotas maks . 2011-11-22 21:03 '11, 21:03, 2011-11-22 21:03

Tai „JavaScript“ trūkumas. Kai funkcija yra objekto ypatybė, labiau pritaikytas pavadinimas, tai reiškia objektą. Pavyzdžio įvykių tvarkytojo sudėtyje esantis objektas yra elementas, kuris sukelia įvykį. Kai vadinama standartine funkcija, tai bus nuoroda į pasaulinį objektą. Kai turite įdėtų funkcijų, kaip ir jūsų pavyzdyje, tai visai nesusijusi su išorinės funkcijos kontekstu. Vidinės funkcijos dalijasi sritimi su ribota funkcija, todėl kūrėjai naudoja var that = this kad išsaugotų tai , ko jiems reikia vidinėje funkcijoje.

9
16 марта '15 в 23:42 2015-03-16 23:42 atsakymą pateikė kombatas kovo 16 d. 15 val. 23:42 2015-03-16 23:42

Kintamąjį užfiksuoja integruotos funkcijos, apibrėžtos metode. this funkcija bus nuoroda į kitą objektą. Tokiu būdu, galite priversti funkciją palaikyti nuorodą į this išorinėje srityje.

9
07 июня '09 в 18:02 2009-06-07 18:02 Atsakymą pateikė „ Mehrdad Afshari “ birželio 07 d. 09:18:02 2009-06-07 18:02

Kaip paaiškino kiti, var self = this; leidžia kodui uždaryti, kad būtų nurodyta pagrindinė sritis.

Tačiau dabar 2018 ir ES6 yra plačiai remiamos visose pagrindinėse interneto naršyklėse. var self = this; idioma nėra tokia reikšminga, kaip kadaise.

Dabar galite išvengti var self = this; naudojant rodyklių funkcijas .

Tais atvejais, kai mes naudojome var self = this :

 function test() { var self = this; this.hello = "world"; document.getElementById("test_btn").addEventListener("click", function() { console.log(self.hello); // logs "world" }); }; 

Dabar mes galime naudoti rodyklės funkciją be var self = this :

 function test() { this.hello = "world"; document.getElementById("test_btn").addEventListener("click", () => { console.log(this.hello); // logs "world" }); }; 

Rodyklės funkcijos neturi savo savybių ir tik prielaida, kad apimtis yra uždaryta.

6
30 янв. atsakymą pateikė Elliot B. Jan 30 2018-01-30 05:38 '18 at 5:38 201-01-30 05:38

Tiesą sakant, savęs yra >window.self ), taigi, kai jūs sakote var self = 'something' , jūs nepaisysite savęs >

Štai kodėl dauguma kūrėjų pageidauja, var that = this per var self = this;

Bet kuriuo atveju; var that = this; nesilaiko geros praktikos ... darant prielaidą, kad jūsų kodas bus pakeistas ar pakeistas vėliau kitais kūrėjais, turėtumėte naudoti dažniausiai naudojamus programuotojo standartus programuotojo bendruomenei

Todėl turėtumėte naudoti kažką panašaus į var oldThis / var oThis / etc - būti aišku savo vietovėje // ne tiek daug, bet išsaugoti kelias sekundes ir keletą smegenų ciklų

5
22 мая '14 в 12:14 2014-05-22 12:14 atsakymas duotas SorinN gegužės 22, 14, 12:14 2014-05-22 12:14

Kaip minėta kelis kartus, „I“ paprasčiausiai naudojamas išsaugoti nuorodą „tai“ prieš įvedant funkciją. Kai tik ši funkcija reiškia kažką kitą.

0
27 дек. atsakymas suteiktas Cyprien 27 Dec. 2014-12-27 20:54 '14, 20:54, 2014-12-27 20:54
 function Person(firstname, lastname) { this.firstname = firstname; this.lastname = lastname; this.getfullname = function () { return '${this.firstname} ${this.lastname}'; }; let that = this; this.sayHi = function() { console.log('i am this , ${this.firstname}'); console.log('i am that , ${that.firstname}'); }; } let thisss = new Person('thatbetty', 'thatzhao'); let thatt = {firstname: 'thisbetty', lastname: 'thiszhao'}; 

thisss.sayHi.call (thatt);

-1
02 авг. atsakymas pateiktas ht zhao 02 rug. 2018-08-02 08:16 '18, 8:16 am 2018-08-02 08:16

Kiti klausimai apie „ etikečių arba Užduoti klausimą