Uzávěr je mechanismus jazyka, při němž je přístup k proměnné zachován (stejně jako její "proměnnost"), i když tato proměnná již není v dosahu (je mimo scope). Odstranit takto proměnnou, která předtím v dosahu byla, a teď už není, je možné přenosem funkce na jiné místo, a to tak, že na místě deklaraci funkci vložíme do proměnné, kterou potom předáme na místo, kde funkcí použitá proměnná už neexistuje, a funkci zavoláme. Funkce by se teoreticky mohla pokusit najít proměnnou stejného názvu v nadřazeném kontextu, to by ale pak na vývojáře kladlo náročný požadavek při každém použití funkce prověřit veškerý nadřazený jmenný rozsah (lexical scope). Navíc je to pochybné i ze sémantického hlediska - nejednalo by se o tu proměnnou, kterou jsme měli na mysli, když jsme ji ve funkci použili. Funnkci můžeme přemístit např. uložením do globální proměnné nebo třeba tak, že ji použijeme jako návratovou hodnotu z funkce, kde jsme ji deklarovali.
Termín uzávěru je podobný jako v logice. Logické formule můžou existovat s tzv. volnými (otevřenými) proměnnými - proměnnými, jejichž hodnotu lze dosazovat zvnějšku. Pokud je svážeme s něčím vnějším, pak souhrn všech takovýchto vazeb formule se nazývá uzávěr. Podobně volné jsou proměnné, které nejsou deklarované přímo ve funkci JavaScriptu. To, co specifikuje jejich svázanost s vnějškem (s nadřazenými kontexty), se nazývá také uzávěr.
Pokud chceme vytvářet nové funkce ve for loopu, narazíme na problém. Takováto konstrukce vypadá na první pohled v pořádku:
Očekáváme, že se nám na výstup vypíše 0 1 2 3 4. Musíme si ale uvědomit, že i je jedna proměnná, se kterou jsou všechny nově vytvořené funkce svázány – všechny funkce vidí stejnou proměnnou. Proto při svém spuštění po ukončení for loopu všechny vypíšou tu stejnou hodnotu: 5 5 5 5 5. Řešením je vytvořit pro každou funkci novou proměnnou, do které se zkopíruje aktuální obsah proměnné i:
Podobný problém býval i s cyklem foreach. Píšu býval, protože v C# 5 se změnila jeho sémantika tak, aby k němu nedocházelo. To bylo možné díky nejednoznačnosti toho, jestli je proměnná odebíraná ze seznamu recyklovaná (starý přístup) nebo pokaždé nově vytvářená (nový přístup). Proto cyklus
vypíše od C# 5 a výš správně hodnoty 1 2 3.