javascript中如何将值传递给回调 我想知道JavaScript引擎如何以及何时将值传递给回调函数,我已经尝试过调试和查找在线,但是我找不到确切的答案,请考虑下面的例子: for(var i = 0; i < 4; i++) { console.log("outside callback " + i + " "); setTimeout(function test(){ console.log("inside callback " + i + " "); },100); } for(变量i=0;i

javascript中如何将值传递给回调 我想知道JavaScript引擎如何以及何时将值传递给回调函数,我已经尝试过调试和查找在线,但是我找不到确切的答案,请考虑下面的例子: for(var i = 0; i < 4; i++) { console.log("outside callback " + i + " "); setTimeout(function test(){ console.log("inside callback " + i + " "); },100); } for(变量i=0;i,javascript,closures,v8,Javascript,Closures,V8,这将打印以下输出 外部回调0 外部回调1 外部回调2 外部回调3 内部回调4 内部回调4 内部回调4 内部回调4 如果我只是使用let关键字更改I变量的声明,如下所示: for(let i = 0; i < 4; i++) { console.log("outside callback " + i + " "); setTimeout(function test(){ console.log("ins

这将打印以下输出

外部回调0

外部回调1

外部回调2

外部回调3

内部回调4

内部回调4

内部回调4

内部回调4

如果我只是使用let关键字更改I变量的声明,如下所示:

for(let i = 0; i < 4; i++) {
    console.log("outside callback " + i + " ");
    
    setTimeout(function test(){
       console.log("inside callback " + i + " ");
    },100);
}
for(设i=0;i<4;i++){
log(“外部回调”+i+”);
setTimeout(函数测试(){
log(“内部回调”+i+”);
},100);
}
它会产生以下输出:

外部回调0

外部回调1

外部回调2

外部回调3

内部回调0

内部回调1

内部回调2

内部回调3


在Chrome中调试时,它在第一个示例中显示i作为测试函数的闭包范围,在第二个示例中显示block范围。

这实际上是因为使用let和var声明的范围,而不仅仅是javascript的闭包属性。

这涉及到一个常见问题,其中详细介绍了为什么在循环中创建的回调函数中,使用
var
声明的变量具有循环结束时达到的值:虽然它们在设置回调时可能持有不同的值,但在一段时间后异步执行回调时,循环已经完成了很长一段时间,并且在闭包中留下了变量,这些变量的值在循环完成时保持不变

从ECMAScript版本6开始,使用
let
声明的变量是块范围的,不能在定义它们的代码块之外访问。此外,在
for
循环控制语句中定义的变量将接受特殊处理

  • 它们的范围是
    for
    循环体的范围,而不是包含
    for
    循环的代码块
  • 为循环的每个迭代创建一个新的
    let
    变量绑定。这意味着每个迭代都可以有自己的变量值集,保存在为迭代创建的词汇环境记录中,可以在闭包中使用,并由循环中定义的回调函数访问

  • 每个词汇环境记录中循环计数器的值旨在使多个环境记录的使用在很大程度上透明:

    for( part1; part2; part3) {
        // loop body code
    }
    
    • 在第一次迭代中,
      for
      语句中定义的
      变量具有执行
      part1
      part2
      后的值
    • 在随后的迭代中,通过将当前迭代的环境记录中的值初始化为上一次迭代结束时的值,然后在上面的
      for
      语句中执行
      part3
      part2
      来确定这些值
    • for
      循环体中声明的回调函数访问设置回调的迭代结束时保存的
      let
      定义变量的值,不包括评估
      for
      语句的
      part3
      的副作用

  • 变量作用域与“当javascript引擎将值传递给回调函数时”有什么关系?请您详细解释一下这里到底发生了什么?我希望这能非常清楚地解释使用全局名称空间的问题。