应该在哪里声明循环中使用的变量?

时间:2018-05-02 18:20:35

标签: javascript

例如,在此代码中:

... snip    
      breadthFirst (callback) {
        // let node; // here?
        while (this.queue.length > 0) {
          // let node = this.queue.shift(); // or here?
          callback(node);
          node.childNodes.forEach( (node) => {
            this.queue.push(node);
          });
        }
      }
    }
... snip

我可以在while循环之外或while循环内声明let。我不确定哪个更好。

请注意,我使用的允许具有块范围,因此之前的SO question不相关。

3 个答案:

答案 0 :(得分:2)

惯例是在while循环中声明它......

breadthFirst (callback) {
        while (this.queue.length > 0) {
          let node = this.queue.shift(); // or here?
          callback(node);
          node.childNodes.forEach( (node) => {
            this.queue.push(node);
          });
        }
      }
    }

然后它仅在该控制语句块中可用。 JavaScript解释器非常智能,无法在每次循环迭代中重新声明它。

答案 1 :(得分:1)

您通常希望尽可能地限制变量的范围,因为在需要/使用它们的所有范围之外建立变量会浪费内存。

所以我会说后者在while循环中更好,只要你在while循环后不再需要它。

答案 2 :(得分:0)

如果你不介意第三种选择,我也不会说。您已经在使用现代语法,那么为什么不使用现代迭代结构,例如for-of?这使您可以更清晰地在循环的头部声明它。

breadthFirst (callback) {
  for (const node of this.queue) {
    callback(node);
    this.queue.push(...node.childNodes);
  }
  this.queue.length = 0;
}

这也通过利用可变参数.push()方法的扩展语法来移除内部循环。

关于变量是否是" redclared" (我假设你担心反复创建一个新的范围),这将比文档更多地归结为实现细节。

const node确实是一个每迭代变量,因此它对循环中声明的函数很有用,但是这并不会阻止变量被预先声明和共享的优化。这种情况下的所有迭代都没有关闭问题。