to źle widzisz ;)
jeśli chodzi o ten kod:
var bar = function () { alert("A"); }
var foo = function() { bar(); }
bar = function () { alert("B"); };
foo();
,
to w tej linii:
var foo = function() { bar(); }
nie ma domknięcia, a jedynie wywołanie funkcji.
w moim przykładzie:
var bar = function (whatever) { whatever() };
też nie ma domknięcia, a jedynie wywołanie funkcji whatever
przekazanej w argumencie.
domknięcie by było, gdyby funkcja była definiowana w funkcji:
var bar = function () {
var animal = 'elephant'
function foo() {
alert(animal); // elephant
}
foo();
}
http://jsfiddle.net/L418b83b/
co ma taką zaletę, że wewnętrzna funkcja foo widzi zmienne z zewnętrznej bar.
nawet wtedy kiedy funkcja bar już zakonczy działanie:
var bar = function () {
var animal = 'elephant'
function foo() {
alert(animal); // elephant
}
return foo;
};
var baz = bar();
baz(); // wywoluje to co zwrocila funkcja bar. A funkcja bar zwrocila funkcję foo. A foo odpala alert ze zmienną animal. Czyli: elephant :)
http://jsfiddle.net/czjtyprk/