在第一行代码中声明所有 javascript 变量的标准?

Standard to declare all javascript variables in first line of code?

我们正在与一家新公司合作,他们有一个编码标准,他们在方法的第一行立即声明方法中使用的所有 Javascript 变量。

我问他们这样做是否有原因,只是简单地告诉他们这是他们的编码标准,所以我用谷歌搜索了一下,显然这确实是某些网站推荐的标准。

我的第一个想法是,如果一个方法太大以至于你 实际上 发现将所有变量放在顶部很有帮助,那么你的方法太大了,需要打破向上。

所以我的问题是,在顶部声明变量而不是在第一次使用时声明它们的目的是什么?它只是一种编码标准,旨在帮助那些编写的方法(在我个人看来)过长的人,还是我忽略了其他好处?

曾经是一种使代码更清晰的方法,回到我们只有var的时候,它被提升了。例如,以下是您现在仍然会看到的一个非常常见的错误:

for (var i = 0; i < arr.length; i++) {
  arr[i].addEventListener('click', function() {
    console.log(i);
  });
}

如果编码风格或 linter 要求将 var i 从循环中提取出来并在函数顶部声明,那么 i 只有一个绑定会变得更加清晰,并且在循环结束时,i === arr.length,可能会提示编码人员在必须运行之前修复逻辑错误:

var i = 0;
for (; i < arr.length; i++) {
  arr[i].addEventListener('click', function() {
    console.log(i);
  });
}

但是现在我们有 constlet,它们没有被提升到循环之外(它们有块作用域,而不是函数作用域),手动将变量声明提升到顶部该函数的实用性要低得多。

有些人可能会争辩说,如果有人认为 const 比 [=20= 更可取,那么现在手动将变量提升到其范围的顶部会使事情 变得更糟 ](const 变量无法重新分配;let 变量可以,使 const 变量更容易让程序员在阅读代码时内化)。例如,假设变量依赖于其他变量的值:重构以下

var startingNum, numMultipliedByTwo, plusOne;
startingNum = 2;
numMultipliedByTwo = startingNum * 2;
plusOne = numMultipliedByTwo + 1;

到ES6+,手动提升,只能用let:

let startingNum, numMultipliedByTwo, plusOne;
startingNum = 2;
numMultipliedByTwo = startingNum * 2;
plusOne = numMultipliedByTwo + 1;

但是由于 let 没有 var 那样的提升问题,并且由于 constlet 更可取,所以可以得出这样的结论sort of style 没有任何好处,而是使用:

const startingNum = 2;
const numMultipliedByTwo = startingNum * 2;
const plusOne = numMultipliedByTwo + 1;

最好在某个地方对所有变量求和,这样更容易理解函数开头存在哪些变量。

假设你在一个非常非常大的函数中有两个变量。 UserRole

您首先会看到这些变量,并且您知道它们在您的所有函数中都可供用户使用,并且您可以在函数中将它们称为全局变量。

然后你有 let 变量,它只存在于这样的地方,例如

var item;
for (var i = 0; i < arr.length; i++) {
  item = arr[i];
  let x = arr[i]; // this will work.
  item .addEventListener('click', function() {
    var subItem = arr[i]; // this wont work. 
    var subItem = item; // this wont work either
    var subItem = x; // this will work.
  });
}

所以公司政策只有在涉及全局变量的情况下(在函数中)才是好的。 你应该试着跟随他们。但是编程是个人的事情,所以要明智地了解在每个上下文中使用什么,并尝试理解每个案例需要什么。