a legfontosabb, hogy megértsük tervezési minták, mint például az élet, hogy észre, hogy mielőtt ES6, JavaScript csak szerepelt funkció hatálya (így hiányzik blokk hatókör), átadva értékek hivatkozással belül lezárások. Ez már nem így van, mivel a JavaScript ES6 verziója a blokk hatókörét az új let
és const
kulcsszavakkal valósítja meg.
Evaluation contextEdit
a blokk hatókörének hiánya azt jelenti, hogy a hurokban (például) definiált változók definícióját “felemelik” a zárófunkció tetejére. Nehéz lehet egy olyan függvény értékelése, amely a külső függvény által módosított változóktól függ (beleértve az iterációt is). Ezt hurok nélkül láthatjuk, ha frissítünk egy értéket a függvény meghatározása és meghívása között.
var v, getValue;v = 1;getValue = function () { return v; };v = 2;getValue(); // 2
bár az eredmény nyilvánvalónak tűnhet a v
kézi frissítésekor, nem kívánt eredményeket hozhat, ha a getValue()
egy hurokban van meghatározva.
ezután a függvény argumentumként átadja a v
függvényt, és azonnal meghívásra kerül, megőrizve a belső függvény végrehajtási kontextusát.
var v, getValue;v = 1;getValue = (function (x) { return function () { return x; };})(v);v = 2;getValue(); // 1
ez egyenértékű a következő kóddal:
var v, getValue;v = 1;function f(x) { return function () { return x; };};getValue = f(v);v = 2;getValue(); // 1
David Herman hatékony JavaScript tartalmaz egy példát, amely szemlélteti az értékelési kontextus problémáit a hurkokon belül. Míg Herman példája szándékosan szövevényes, közvetlenül a blokk hatókörének ugyanazon hiányából fakad.
privát változók és accessorsEdit
az IIF-ek szintén hasznosak az elérhető függvények privát metódusainak létrehozásához, miközben bizonyos tulajdonságokat később is feltárnak. A következő példa Alman iifes-I bejegyzéséből származik.
// "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
ha megpróbálunk hozzáférni a counter.i
globális környezetből, akkor nem lesz definiálva, mivel a meghívott függvénybe van zárva, és nem a counter
tulajdonsága. Hasonlóképpen, ha megpróbálunk hozzáférni i
, akkor hibát fog eredményezni, mivel nem deklaráltuk i
a globális környezetben.