Javascript没有在嵌套函数中创建闭包?

时间:2018-05-11 18:10:21

标签: javascript closures

我已经花了好几个小时,但我无法弄明白。我似乎无法让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的调试器显示它使用函数inner_b创建了Closure(outerfn)。请注意,inner_a不在闭包中。

当我模拟事件回调时,我在那里定义了一个匿名函数。此时,本地环境具有inner_a_var。鉴于我对闭包的理解,这个动作应该创建一个名为inner_a的新闭包,其中包含inner_a_var。它没有。

当我在call_my_arg中放置一个断点并检查fcn时,调试器只显示了outerfn闭包。当然,当调用该函数时,我无法访问inner_a_var。

有人能解释一下这里发生了什么吗?

我是否在Chrome 66上对此进行了测试

这不是学术活动。我在构建一个jQuery小部件时遇到了这种情况,其中outerfn是_create函数,然后需要设置事件处理程序,它使用嵌套函数来试图避免金字塔地狱并重用一些逻辑。

0 个答案:

没有答案