Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript闭包错误行为_Javascript_Closures - Fatal编程技术网

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这与模板文本无关。这是关于闭包行为的,我理解。但我相信你的答案是正确的。虽然我认为我非常了解闭包,但很容易落入这样的陷阱。谢谢,我投了你的票。