Javascript没有从嵌套函数中创建闭包?
我已经花了好几个小时来研究这个问题,但我就是想不出来。我似乎无法让JS从嵌套函数中创建闭包: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
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上试用。编辑: