在第一行代码中声明所有 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);
});
}
但是现在我们有 const
和 let
,它们没有被提升到循环之外(它们有块作用域,而不是函数作用域),手动将变量声明提升到顶部该函数的实用性要低得多。
有些人可能会争辩说,如果有人认为 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
那样的提升问题,并且由于 const
比 let
更可取,所以可以得出这样的结论sort of style 没有任何好处,而是使用:
const startingNum = 2;
const numMultipliedByTwo = startingNum * 2;
const plusOne = numMultipliedByTwo + 1;
最好在某个地方对所有变量求和,这样更容易理解函数开头存在哪些变量。
假设你在一个非常非常大的函数中有两个变量。 User
和 Role
您首先会看到这些变量,并且您知道它们在您的所有函数中都可供用户使用,并且您可以在函数中将它们称为全局变量。
然后你有 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.
});
}
所以公司政策只有在涉及全局变量的情况下(在函数中)才是好的。
你应该试着跟随他们。但是编程是个人的事情,所以要明智地了解在每个上下文中使用什么,并尝试理解每个案例需要什么。
我们正在与一家新公司合作,他们有一个编码标准,他们在方法的第一行立即声明方法中使用的所有 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);
});
}
但是现在我们有 const
和 let
,它们没有被提升到循环之外(它们有块作用域,而不是函数作用域),手动将变量声明提升到顶部该函数的实用性要低得多。
有些人可能会争辩说,如果有人认为 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
那样的提升问题,并且由于 const
比 let
更可取,所以可以得出这样的结论sort of style 没有任何好处,而是使用:
const startingNum = 2;
const numMultipliedByTwo = startingNum * 2;
const plusOne = numMultipliedByTwo + 1;
最好在某个地方对所有变量求和,这样更容易理解函数开头存在哪些变量。
假设你在一个非常非常大的函数中有两个变量。 User
和 Role
您首先会看到这些变量,并且您知道它们在您的所有函数中都可供用户使用,并且您可以在函数中将它们称为全局变量。
然后你有 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.
});
}
所以公司政策只有在涉及全局变量的情况下(在函数中)才是好的。 你应该试着跟随他们。但是编程是个人的事情,所以要明智地了解在每个上下文中使用什么,并尝试理解每个案例需要什么。