我已经花了好几个小时,但我无法弄明白。我似乎无法让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函数,然后需要设置事件处理程序,它使用嵌套函数来试图避免金字塔地狱并重用一些逻辑。