Can I completely stop using var?
我正在学习Java课程,所有声明都使用块范围(EDCOX1,0)。但在javascript中,var是功能范围。
let在es6中出现,给了JS开发人员块范围。我正在调整我的编码风格,并选择一起摆脱var。
这样行吗?
- 是的,甚至谷歌也在它的风格指南中把它删除了。谷歌JS风格指南
- 是的,如果您决定不支持旧的浏览器或者使用蒸腾器。在ES6中,没有任何理由希望var取代let或const。
- 这取决于使用。删除所有var后,您将获得什么好处?你有单元测试用例吗?你能检查一下在替换之后没有什么东西破坏了你的代码吗?
- 为了好玩,请注意Java和JavaScript之间的区别。
- var的唯一有用的应用是,一个全局可以在全局范围内多次重新定义,而不会导致错误。如果有多个脚本定义全局,但只有最后一个定义才生效,则可能发生这种情况。
- @cale_b-这项工作的区别似乎很明显。
- @T.J.克劳德——的确。但让我想起了我最喜欢的JavaVS JavaScript的解释,并认为分享它会很有趣。不是故意暗示的!
- @卡尔-这很有趣。-)
- 我一直面临的问题是,"let"语句不支持"window.[我的变量名]"功能。因此,如果您动态地获取变量值(通过其字符串名称),您将希望在一段时间内使用"var"语句-或者更新代码以使用"eval",如stackoverflow.com/questions/50111200/&hellip中所示;
Is this O.K.?
大部分;可能全部。由于技术(而非风格)原因,很少有您想使用var而不是let或const的情况:
如果要声明成为全局对象属性的全局变量(global let、const和class创建全局变量,但它们不成为全局对象的属性)。
当然,您可以使用this.varName = ...而不是var varName,因为全局scope1的this是全局对象。
如果您希望有多个文件,其中任何一个文件都可能是"第一个"(但不是最后一个)来定义相同的全局文件,就像旧模块格式中常见的那样,例如:
1 2
| var MyApp = MyApp || {};
MyApp.something = /*...*/; |
这是因为,如果已声明MyApp,则默认忽略var MyApp部分;如果已在当前范围内声明标识符,则使用let的等效结构将失败,因为无法使用该结构。
当然,您现在可能正在使用一种新的模块格式。:-)如果你没有,你也可以这样做。
1 2
| this.MyApp = this.MyApp || {};
MyApp.something = /*...*/; |
在全球范围内。1
[在用作循环计数器的函数中,使用var而不是let,过去有一个较小的性能优势。现代浏览器的最新版本几乎都删除了这一小好处(但它还是很小的好处)。]
1请注意,模块中的顶级代码(ES2015模块、node.js模块、大多数bundler…)不在全局范围内。它在模块范围内。另请注意,在ES2015模块的顶层,this的值为undefined。
- 在ES6模块中,this不是全局的,可能需要澄清。
- @洛根神话-谢谢,我已经强调过了。我说过"在全局范围",当然,模块范围不是全局范围。但是…
- 真的!当然,这是一些人忽略的区别。
- 为什么说let和const创建一个全局,文档说它们是函数范围的。
- If you want to declare a global variable that becomes a property of the global object (global let, const, and class create globals, but they don't become properties of the global object)
- @johnmorsey-"文档说它们是函数范围的"let和const不是函数范围的,它们是块范围的(即比函数范围更窄的范围)。var是函数范围的。我上面说的是,在全球范围内,let和const(和class)创造的全球不是全球对象的属性。全局范围的var创建全局对象的属性。
如果只针对支持ES6的平台,则采用let和const。停止使用VAR。
- 虽然不太深入,但这是更好的答案。如果你需要使用var,你就错了。如果可以使用const,则使用const,否则使用let。