Välittömästi vedottu funktion lauseke

avain ymmärtää suunnittelumalleja, kuten IIFE on ymmärtää, että ennen ES6, JavaScript vain featured funktion scope (näin puuttuu block scope), kulkee arvot viitteenä sisällä sulkuja. Näin ei enää ole, sillä JavaScriptin ES6-versio toteuttaa lohkokartoituksen käyttämällä uutta let ja const keywords.

Evaluation contextEdit

lohkon soveltamisalan puuttuminen tarkoittaa, että (esimerkiksi) A for Loopin sisällä määriteltyjen muuttujien määritelmä ”nostetaan” koteloivan funktion yläosaan. Funktion arviointi, joka riippuu ulkofunktion (myös iteraation) muokkaamista muuttujista, voi olla vaikeaa. Voimme nähdä tämän ilman silmukkaa, jos päivitämme arvon funktion määrittelyn ja kutsumisen välillä.

var v, getValue;v = 1;getValue = function () { return v; };v = 2;getValue(); // 2

vaikka tulos voi tuntua itsestään selvältä päivitettäessä v manuaalisesti, se voi tuottaa tahattomia tuloksia, kun getValue() on määritelty silmukan sisällä.

jäljempänä funktio kulkee v argumenttina ja siihen vedotaan välittömästi, säilyttäen sisäisen funktion suorituskontekstin.

var v, getValue;v = 1;getValue = (function (x) { return function () { return x; };})(v);v = 2;getValue(); // 1

Tämä vastaa seuraavaa koodia:

var v, getValue;v = 1;function f(x) { return function () { return x; };};getValue = f(v);v = 2;getValue(); // 1

David Hermanin efektiivinen JavaScript sisältää esimerkin, joka havainnollistaa arviointiyhteyden ongelmia silmukoiden sisällä. Vaikka Hermanin esimerkki on tarkoituksellisesti mutkikas, se nousee suoraan samasta blokkien puuttumisesta.

yksityisten muuttujien ja accessorsEdit

IIF: t ovat myös hyödyllisiä määriteltäessä yksityisiä menetelmiä esteettömille funktioille, mutta samalla paljastetaan joitakin ominaisuuksia myöhempää käyttöä varten. Seuraava esimerkki on Alman iifes-postauksesta.

// "counter" is a function that returns an object with properties, which in this case are functions.var counter = (function () { var i = 0; return { get: function () { return i; }, set: function (val) { i = val; }, increment: function () { return ++i; } };})();// These calls access the function properties returned by "counter".counter.get(); // 0counter.set(3);counter.increment(); // 4counter.increment(); // 5

jos yritämme päästä counter.i globaalista ympäristöstä, se jää määrittelemättömäksi, koska se on suljettuna kutsuttuun funktioon eikä ole counter. Samoin, jos yritämme päästä i, se johtaa virheeseen, sillä emme ole julistaneet i globaalissa ympäristössä.

Vastaa

Sähköpostiosoitettasi ei julkaista.