Лексикален контекст и вложени функции
var x = "глобален"; функция f() var x = "локален"; функция g() < предупреждение (x); > g(); > f(); // Извикването на тази функция връща "local"
г. Това не води до нищо изненадващо, освен когато функцията връща вложена функция. Разгледайте следния код, който включва функция, която връща вложена функция. Всеки път, когато бъде извикана, тя връща функция. Кодът за връщане на функцията винаги е един и същ, но контекстът, в който е създадена, е малко по-различен при всяко извикване, тъй като стойностите на аргументите, предадени на външната функция, се различават. Ако съхраним върнатите функции в масив и извикаме всяка от тях, ще видим, че те връщат различни стойности. Всички функции съдържат един и същ код и се извикват от един и същи контекст, така че единственият фактор, който може да доведе до връщане на различни стойности, е контекстът, в който са дефинирани функциите.
// Тази функция връща функция при всяко извикване. // Контекстът на дефиницията на функцията е различен за всяко извикване function makefunc(x) return function() < връщане x; > > // Извиква makefunc() няколко пъти и съхранява резултатите в масив: var a = [makefunc(0), makefunc(1), makefunc(2)]; // Сега извикайте тези функции и покажете техните стойности // Въпреки че телата на всички функции са еднакви, контекстът е различен // и всяко извикване връща различна стойност. предупреждение(a[0]()); // Показване на 0 alert(a[1]()); // Показване на 1 alert(a[2]()); // Показва 2
Резултатът от този код може да изглежда изненадващ.