„JavaScript“ funkcijos ir metodai (ir kiti naudingi patarimai)

Jei ateisite į „JavaScript“ išmokę kitą pagrindinę kalbą, galite susipainioti su kai kuriomis „JavaScript“ terminijomis - buvau. Nors žinant kiekvieną „JavaScript“ žodyno terminą nebūtinai pagerės jūsų kodas, jų nežinojimas gali sukelti nepatogių situacijų. Dėl šios priežasties aš sukūriau šį kodų lapą, kuris padės jums (ir man) geriau suprasti kai kuriuos niuansus, susijusius su „JavaScript“ funkcijomis:

Funkcijos ir metodai

Taigi, kuo jie skiriasi?

Metodai turi „imtuvą“, o funkcijos neturi.

Tai nėra būdinga tik „JavaScript“, tačiau vis tiek gera išmokti ir atsiminti. Mano pagrindas yra rubinas ir retai kada girdėjau terminą „funkcija“. Viskas apie tuos metodus (be raketų ir lambdų). Niekada nelabai supratau skirtumo, kol nepradėjau mokytis „JavaScript“.

Be to, šis apibrėžimas gali būti techniškai netikslus „JavaScript“ programoje - aš jums parodysiu kodėl), tačiau tai turbūt lengviausias būdas apie tai galvoti. Jei nežinote, kas yra „imtuvas“, pažiūrėkite į žemiau pateiktą kodo fragmentą:

someObject.someMethod ()

Šiame kontekste „someObject“ yra imtuvas, o „someMethod“ yra metodas. Palyginkite tai su funkcijos kvietimu:

someFunction (arg)

Atkreipkite dėmesį, kaip nėra imtuvo. „JavaScript“ programoje funkcijos iškviečiamos be imtuvo, naudojant parens sintaksę (). Imtuvas yra tai, kas skiria funkciją nuo metodo.

Technikos

Nors gali atrodyti, kad funkcija iškviečiama be „JavaScript“ imtuvo, vis dėlto yra pilka sritis. Kai funkcija paskelbiama globaliu mastu, ji tampa visuotinio objekto nuosavybe. Naršyklėje globalus objektas yra langas:

funkcija helloWorld () {
  console.log ('sveikas pasaulis');
}
Labas pasauli(); // Žurnalai „sveikas pasaulis“
langas.helloWorld (); // Taip pat registruojamas „sveikas pasaulis“

Kaip matote paskutinėje eilutėje, langas yra helloWorld imtuvas, dėl kurio helloWorld gali būti metodas, o ne mano paties apibrėžta funkcija. Tačiau „JavaScript“ sistemoje ji vis dar laikoma funkcija.

Kitas dalykas, į kurį reikia atkreipti dėmesį, jūs galite lengvai paversti metodą funkcija ir atvirkščiai.

var object = {
  metodas: function () {
    console.log („Ar aš vis dar esu metodas?“);
  }
};
objektas.metodas (); // metodo skambutis
var func = objektas.metodas;
func (); // dabar tai funkcijos kvietimas

Funkcijos deklaracija vs funkcijos išraiška

Koks skirtumas?

Jei eilutė prasideda žodžiu „function“, tai yra deklaracija. Priešingu atveju tai yra išraiška.

Štai keletas pavyzdžių:

// Tai yra funkcijos deklaracija
funkcija labas () {
  console.log ('Sveikas pasaulis');
}
// Tai yra funkcijos išraiška
var hello = function () {
  console.log ('Sveikas pasaulis');
};
// Tai taip pat yra funkcijos išraiška.
(funkcija() {
  console.log ('Sveikas pasaulis');
}) ();

Paskutiniame posakyje atkreipkite dėmesį, kad eilutė prasidėjo (ir neveikia.

Netiesioginis ir aiškus funkcijos kontekstas

Koks skirtumas?

Aiškus kontekstas yra tada, kai kontekstas yra aiškiai apibrėžtas ir perduotas. Netiesioginis kontekstas yra tada, kai kontekstas paliekamas ir runtime jį interpretuoja.

Ir jei jūs nežinote, ką turiu omenyje „kontekstą“, turiu omenyje tai, kas lygu, kai vykdoma funkcija.

Tai gali būti sunkiau suprasti, todėl žiūrėkite žemiau pateiktą kodą:

funkcijos kontekstas () {
  console.log ('kontekstas yra' + tai);
}
var someObject = {};
kontekstas.kvietimas (kai kuris objektas);
// Žurnalai: 'kontekstas yra [objektas Objektas]'
// Tai aiškus kontekstas. Kontekstas yra aiškiai apibrėžtas.
kontekstas ();
// Žurnalai: 'kontekstas yra [objekto langas]'
// Tai yra netiesioginis kontekstas. Kontekstas nėra apibrėžtas.

Atlikdami aiškų konteksto vykdymą, mes tiesiogiai liepėme konteksto funkcijai naudoti „someObject“ kontekstą. Todėl tai buvo priskirta someObject, todėl konteksto atsijungimas yra [Object Object].

Tačiau netiesiogiai vykdant nebuvo suteikta jokio konteksto. Ir kadangi funkcijos yra globaliojo objekto savybės, tai prilygs visuotiniam objektui. Štai kodėl jis atsijungė nuo konteksto: [objekto langas].

Pirmos klasės funkcijos palyginti su aukštesnės eilės funkcijomis

Koks skirtumas?

Pirmos klasės funkcijos traktuojamos kaip objektai. Aukštesnės eilės funkcijos priima funkciją kaip argumentą, grąžina funkciją arba abi.

Kai sakau, kad pirmos klasės funkcijos yra traktuojamos kaip objektai, aš turiu omenyje, kad jos turi būsenas ir elgesį, be to, jas galima perduoti kaip argumentus funkcijose ir sugrąžinti iš funkcijų. Tokiu būdu aukštesnės eilės funkcijos iš esmės naudoja pirmosios eilės funkcijas ir pačios yra pirmosios eilės funkcijos.

Pavyzdžiai:

// Aukštesnės eilės funkcija
funkcija aukštesnė (atgalinis ryšys) {// perduodama pirmosios eilės funkcija
  perskambink();
  
  grįžti atgal; // grąžinama pirmojo užsakymo funkcija.
}
var atšaukimas = didesnis (function () {
  console.log ('Sveikas pasaulis');
});
// Žurnalai: „Sveikas pasaulis“
perskambink();
// Taip pat žurnalai: „Sveikas pasaulis“

Nors pirmosios eilės ir aukštesnio lygio funkcijos nebūtinai yra susijusios, sunku įsivaizduoti programavimo kalbą, palaikančią vieną, o ne kitą.

Nors tai toli gražu nėra visas dalykų, kuriuos reikia žinoti apie „JavaScript“ funkcijas, sąrašas, tikiuosi, kad galite naudoti jį kaip patogų nuorodų vadovą. Bent jau tai gali būti puiki nuoroda pradedantiesiems, pradedantiems „JavaScript“ ar kitiems, perkeliantiems iš kitos programos kalbos.

„JavaScript“ turi savo trūkumų ir trūkumų, tačiau ji yra čia. Viskas, ką galime padaryti, yra išmokti tai mylėti. Laimingo programavimo!