Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.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
JavaScriptES6是如何实现的;让我们;在for循环迭代定义中在场景后面工作_Javascript_Ecmascript 6 - Fatal编程技术网

JavaScriptES6是如何实现的;让我们;在for循环迭代定义中在场景后面工作

JavaScriptES6是如何实现的;让我们;在for循环迭代定义中在场景后面工作,javascript,ecmascript-6,Javascript,Ecmascript 6,提倡在for循环中使用该语句,以替换迭代变量的var声明 通过使用let用户可以放弃立即调用函数的使用 例如,为回调保留迭代变量的值 发件人: 结果: start in loop 0 in loop 3 end undefined 2 5 start in loop 0 in loop 3 end undefined 6 6 第二次迭代中的更改不会传播到第一次迭代超时回调 目前,我认为for循环实现为每个迭代创建一个块执行上下文,将迭代变量作为param传输,并在块执行结束后特别提取其值,并

提倡在
for
循环中使用该语句,以替换迭代变量的
var
声明

通过使用
let
用户可以放弃立即调用函数的使用 例如,为回调保留迭代变量的值

发件人:

结果:

start
in loop 0
in loop 3
end
undefined
2
5
start
in loop 0
in loop 3
end
undefined
6
6
第二次迭代中的更改不会传播到第一次迭代超时回调


目前,我认为
for
循环实现为每个迭代创建一个块执行上下文,将迭代变量作为param传输,并在块执行结束后特别提取其值,并在
for
机制中为下一次迭代使用它。但知道这是真是假以及它是如何实现的将是一件有趣的事情。

没有什么好说的。你的观察是正确的。每个迭代都有一个单独的块。因此,无论超时多长时间,您都会看到相同的结果

在每次迭代结束时,
i
的值将传递给下一次迭代。由于
i
不是对象,因此不会通过引用传递它。因此,在下一次迭代中修改/增加i不会影响上一次迭代块中
i
的值

为了好玩,请尝试使用对象而不是原始数字:

console.log("start");
for (let i = {i:0}; i.i < 5; i.i++) {
    console.log("in loop", i.i);
    setTimeout(function () {           
      console.log(i.i);
    }, 0);
    i.i = i.i + 2;

}
console.log("end");

如您所见,在这种情况下,
i.i
变量实际上将通过引用传递,因此您可以在不同的迭代块上修改它。

True。取决于浏览器你会发现它是如何工作的,但是,它不是那么可读…看看下面的段落。它的实现方式取决于JavaScript引擎。“因为我不是一个对象,它不会通过引用传递。”误用术语“通过引用传递”是一个常见的错误。JavaScript中没有任何内容是通过引用传递的。无论是“按引用传递”还是“按值传递”,都与传递的值无关。JavaScript是按值传递的,对象表示为引用。更多:我明白你的意思。有没有关于如何重新表述的建议?“因为
i
的值是一个数字,因此是不可变的”可能。
console.log("start");
for (let i = {i:0}; i.i < 5; i.i++) {
    console.log("in loop", i.i);
    setTimeout(function () {           
      console.log(i.i);
    }, 0);
    i.i = i.i + 2;

}
console.log("end");
start
in loop 0
in loop 3
end
undefined
6
6