Я возился с этим часами, и я просто не могу понять это. Я не могу заставить JS создать замыкание из вложенной функции:
function outerfn(z) {
var inner_a = function(y) {
var inner_a_var = y+5; // STEP 3: create a local variable in-scope for this function
call_my_arg(function(x) { // Shouldn't this capture inner_a_var in a closure?
inner_b(inner_a_var + x); // only closure here is called outerfn and does not contain inner_a_var
});
};
var inner_b = function(w) {
console.log(w);
};
inner_a(z); // STEP 2: call my internal function
}
outerfn(1); // STEP 1: get the ball rolling
function call_my_arg(fcn) { // simulate an event callback
fcn(1);
}
Я действительно не уверен, что здесь происходит. На шаге 3 отладчик Chrome показывает, что он создал Closure (externalfn) с функцией inner_b. Обратите внимание, что inner_a не находится в замыкании.
Когда я имитирую обратный вызов события, я сразу определяю анонимную функцию. В этот момент локальная среда имеет inner_a_var. Учитывая все, что я понимаю о замыканиях, это действие должно создать новое замыкание с именем inner_a, содержащее inner_a_var. Это не так.
Когда я ставлю точку останова в call_my_arg и проверяю fcn, отладчик просто показывает замыкание externalfn. И, конечно, когда вызывается функция, у меня нет доступа к inner_a_var.
Может кто-нибудь объяснить, что здесь происходит?
FWIW Я тестирую это на Chrome 66
Это не академическое упражнение. Я сталкивался с этой ситуацией при создании виджета jQuery, где externalfn - это функция _create, которая затем должна настроить обработчики событий, для которых она использует вложенные функции, чтобы попытаться избежать пирамидального ада и повторно использовать некоторую логику.