Javascript не создает закрытие из вложенной функции? - PullRequest
0 голосов
/ 11 мая 2018

Я возился с этим часами, и я просто не могу понять это. Я не могу заставить 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, которая затем должна настроить обработчики событий, для которых она использует вложенные функции, чтобы попытаться избежать пирамидального ада и повторно использовать некоторую логику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...