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

Javascript没有从嵌套函数中创建闭包?,javascript,closures,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

我已经花了好几个小时来研究这个问题,但我就是想不出来。我似乎无法让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的调试器显示它使用函数internal_b创建了闭包(outerfn)。请注意,内部_a不在闭包中

当我模拟一个事件回调时,我正在定义一个匿名函数。在这一点上,本地环境已经有了inner_a_var。考虑到我对闭包的所有了解,这个操作应该创建一个名为inner_a的新闭包,其中包含inner_a_var。它没有

当我在call_my_arg中放置断点并检查fcn时,调试器只显示outerfn闭包。当然,当函数被调用时,我没有访问内部变量的权限

有人能解释一下这是怎么回事吗

FWIW我正在Chrome 66上测试这个


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

“outerfn”不是闭包的名称,而是为要关闭的范围指定的名称。鉴于
internal\u a
不是命名函数,它可能不会显示该作用域的名称。我无法复制。当我在
call_my_arg
中放置断点并检查
fcn
时,我可以看到
[Scopes]:Scopes[3]
0:Closure(inner_a){type:“Closure”,name:“inner_a”,object:{…}1:Closure(outerfn){type:“Closure”,name:“outerfn”,object:{…}2:Global{type:“Global”,name:,“object:Window}
)-正如你所料,我对问题的含义有点迷茫。代码似乎按照我的预期和您的预期工作。我也在Chrome 66上试用。编辑: