栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么在nodejs的for循环中让它比var慢?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么在nodejs的for循环中让它比var慢?

基于

var
vs.
的机制差异
let
,这与以下事实有关:
var
存在于匿名函数的整个块范围中,而
let
仅存在于循环中,并且每次迭代都必须重新声明。1这是说明这一点的示例:

(function() {  for (var i = 0; i < 5; i++) {    setTimeout(function() {      console.log(`i: ${i} seconds`);    }, i * 1000);  }  // 5, 5, 5, 5, 5  for (let j = 0; j < 5; j++) {    setTimeout(function() {      console.log(`j: ${j} seconds`);    }, 5000 + j * 1000);  }  // 0, 1, 2, 3, 4}());

请注意,在

i
循环的所有迭代中共享,而
let
不是。根据您的基准,似乎node.js尚未针对其优化作用域规则,
let
因为它比以前更新且复杂得多
var

细化

这是对

let
in
for
循环的一些外行解释,适用于那些不关心细致的规范,但好奇如何
let
在每次迭代中重新声明而又保持连续性的人。

但是

let
不可能每次迭代都重新声明,因为如果在循环内更改它,它将传播到下一个迭代!

首先,这里有一个几乎可以证明这一潜在反论点的例子:

(function() {  for (let j = 0; j < 5; j++) {    j++; // see how it skips 0, 2, and 4!?!?    setTimeout(function() {      console.log(`j: ${j} seconds`);    }, j * 1000);  }}());

您部分正确,因为更改尊重的连续性

j
。但是,对于每次迭代,仍然需要重新声明它,如Babel所示:

"use strict";(function () {  var _loop = function _loop(_j) {    _j++; // here's the change inside the new scope    setTimeout(function () {      console.log("j: " + _j + " seconds");    }, _j * 1000);    j = _j; // here's the change being propagated back to maintain continuity  };  for (var j = 0; j < 5; j++) {    _loop(j);  }})();

就像有人说的那样。复杂的规则。毫无疑问,基准测试表现出如此巨大的性能差异(目前)。希望将来会进一步优化。


1:在Babel的REPL上查看此转译版本,以观看演示。

let
在这样的
for
循环中声明变量时会发生什么情况,即创建了一个新的声明性环境来保存该变量(在此处进行详细说明),然后 为每次循环迭代 创建 另一个 声明性环境来保存该变量的每次迭代副本;
每次迭代的副本都是从前一个的值初始化的(此处有详细信息),但是它们是独立的变量,如闭包所输出的值所示。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/417890.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号