Umiddelbart påberåbt funktionsekspression

nøglen til forståelse af designmønstre som IIFE er at indse, at JavaScript før ES6 kun indeholdt funktionsomfang (mangler således blokomfang) og overførte værdier ved reference inde i lukninger. Dette er ikke længere tilfældet, da ES6-versionen af JavaScript implementerer blokscoping ved hjælp af de nye let og const nøgleord.

Evalueringskontekstedit

manglende blokomfang betyder, at variabler defineret inde i (for eksempel) A For loop vil have deres definition “hejst” til toppen af den omsluttende funktion. Det kan være vanskeligt at evaluere en funktion, der afhænger af variabler modificeret af den ydre funktion (inklusive ved iteration). Vi kan se dette uden en løkke, hvis vi opdaterer en værdi mellem at definere og påberåbe sig funktionen.

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

selvom resultatet kan virke indlysende ved opdateringvmanuelt kan det producere utilsigtede resultater, nårgetValue() er defineret inde i en løkke.

herefter passerer funktionenv som et argument og påberåbes straks og bevarer den indre funktions eksekveringskontekst.

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

Dette svarer til følgende kode:

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

David Hermans effektive JavaScript indeholder et eksempel, der illustrerer problemerne med evalueringskontekst inde i sløjfer. Mens Hermans eksempel bevidst er indviklet, stammer det direkte fra den samme mangel på blokomfang.

oprettelse af private variabler og tilbehørredit

IIF ‘ er er også nyttige til etablering af private metoder til tilgængelige funktioner, mens de stadig udsætter nogle egenskaber til senere brug. Følgende eksempel kommer fra Alman ‘ s indlæg på IIFEs.

// "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

Hvis vi forsøger at få adgang tilcounter.ifra det globale miljø, vil det være udefineret, da det er lukket inden for den påkaldte funktion og ikke er en egenskab afcounter. Ligeledes, hvis vi forsøger at få adgang til i, vil det resultere i en fejl, da vi ikke har erklæret i i det globale miljø.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.