例如,在此代码中:
... 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不相关。
答案 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
确实是一个每迭代变量,因此它对循环中声明的函数很有用,但是这并不会阻止变量被预先声明和共享的优化。这种情况下的所有迭代都没有关闭问题。