JavaScript闭包错误行为
下面是一段代码,我觉得闭包函数有一种奇怪的行为JavaScript闭包错误行为,javascript,closures,Javascript,Closures,下面是一段代码,我觉得闭包函数有一种奇怪的行为 var-arr=[5,6,7,8,9,0]; var someFn; arr.forEach(函数(val,idx){ 如果(!someFn){ someFn=函数(){ log(`B:${idx}:${val}`); }; } log(`A:${idx}:${val}`); someFn(); });根据此,以便: 闭包是在函数开始执行时分配的堆栈帧 因此,每个函数调用都会创建自己的闭包 forEach的作用是它接受一个函数(回调)并多次调用它
var-arr=[5,6,7,8,9,0];
var someFn;
arr.forEach(函数(val,idx){
如果(!someFn){
someFn=函数(){
log(`B:${idx}:${val}`);
};
}
log(`A:${idx}:${val}`);
someFn();
});代码>根据此,以便:
闭包是在函数开始执行时分配的堆栈帧
因此,每个函数调用都会创建自己的闭包
forEach
的作用是它接受一个函数(回调)并多次调用它(从数组中传递元素及其索引和数组)。因此,forEach
的每次迭代都会创建一个新的闭包
您在第一次迭代时定义了someFn
(此后再也不会重新声明),因此它所陷入的闭包就是第一次迭代的闭包。因此,唯一可用的值是第一次迭代中的值
闭包与函数本身无关,它与函数调用相关
例如:
函数函数(值){
返回函数(){
返回值;
};
}
var someFn1=函数(“Ibrahim”);
var someFn2=函数(“John”);
log(“someFn1:,someFn1());
log(“someFn2:,someFn2())代码>
我希望someFn
正在创建一个闭包,其中包含变量idx
和val
,并且这两个变量在外部函数中都发生了变化
不,它们不会改变。它们是在每次调用外部函数时实例化的新变量。第一次迭代中的两个变量(在第一次迭代中创建的闭包确实关闭了)保留了它们的值
要获得预期的行为,可以使用不带函数的循环,其中只声明两个变量:
var arr = [5, 6, 7, 8, 9, 0];
for (var [idx, val] of arr.entries()) {
// ^^^^^^^^^^^^^^ global variables
if (!someFn) {
var someFn = function() {
console.log(`B: ${idx} : ${val}`);
};
}
console.log(`A: ${idx} : ${val}`);
someFn();
}
尽管如此:-)我认为这是因为你声明了someFn()
,当前值为idx
和val
,一旦你一直调用它,你就不会传递它们的新值;var someFn;arr.forEach(函数(val,idx){someFn=function(){console.log(B:${idx}:${val}
);};someFn();});这个问题与模板文本无关。所以我决定重新打开它。当然,它已经打开了,请阅读dupe的答案,并思考在上面的代码中何时计算模板字符串。@baao这与模板文本无关。这是关于闭包行为的,我理解。但我相信你的答案是正确的。虽然我认为我非常了解闭包,但很容易落入这样的陷阱。谢谢,我投了你的票。