【问题标题】:Can I completely stop using var?我可以完全停止使用 var 吗?
【发布时间】:2018-10-24 10:04:03
【问题描述】:

我正在学习 Java 课程,所有声明都使用块范围(int, double, boolean, etc.)。然而,在 JavaScript 中 var 是函数作用域。

let 出现在 ES6 中并为 JS 开发人员提供了块范围。我正在调整我的编码风格,并选择一起摆脱var

这样可以吗?

【问题讨论】:

  • 是的,甚至 google 在其风格指南中也将其删除。 Google JS Style Guide
  • 是的,如果您决定不支持旧版浏览器或者您正在使用转译器。在 ES6 中,没有任何理由更喜欢 var 来代替 letconst
  • 视使用情况而定。删除所有 var 后您将获得什么好处?您是否涵盖了单元测试用例。您是否能够检查在没有任何内容替换后是否会破坏您的代码
  • 为了好玩,请注意difference between java and javascript
  • var 唯一有用的应用是可以在全局范围内多次重新定义全局而不会导致错误。如果有多个脚本定义了一个全局,则可能会发生这种情况,但只有最后一个定义应该生效。

标签: javascript ecmascript-6


【解决方案1】:

这样可以吗?

主要是;可能完全。出于技术(而非风格)原因,非常在少数情况下您会希望使用 var 而不是 let/const

  • 如果要声明一个成为全局对象属性的全局变量(全局letconstclass 创建全局变量,但它们不会成为全局对象的属性)。

    当然,您可以使用this.varName = ... 代替var varName,因为在全局范围内的this 是全局对象。

  • 如果您想拥有多个文件,其中任何一个都可能是“第一个”(但不是最后一个)来定义相同的全局文件,这在旧模块格式中很常见,例如:

    var MyApp = MyApp || {};
    MyApp.something = /*...*/;
    

    这很有效,因为如果 MyApp 已经声明,var MyApp 部分将被静默忽略; let 的等效结构将失败,因为如果标识符已在当前范围内声明,则无法使用它。

    当然,您现在可能正在使用一种新的模块格式。 :-) 如果你不是,你也可以这样做

    this.MyApp = this.MyApp || {};
    MyApp.something = /*...*/;
    

    在全球范围内。¹

[使用在用作循环计数器的函数中使用 var 而不是 let 会带来较小的性能优势。现代浏览器的最新版本几乎消除了这个小好处(无论如何它都是小问题)。]


¹ 请注意,模块(ES2015 模块、Node.js 模块、大多数打包程序...)中的顶级代码不是在全局范围内。它在模块范围内。另请注意,在 ES2015 模块的顶层,this 的值是 undefined

【讨论】:

  • this 不是 ES6 模块中的全局变量,可能需要澄清一下。
  • @loganfsmyth - 谢谢,我已经强调了它。我确实说过“在全局范围内”,当然,模块范围不是全局范围。但是...
  • 真的!不过,这绝对是一些人错过的区别。
  • 你为什么说 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)
【解决方案2】:

如果您只针对支持 ES6 的平台,请采用 let 和 const。停止使用 var。

【讨论】:

  • 虽然深度较小,但恕我直言,这是更好的答案。如果你需要使用var,那你就错了。如果可以使用const,则使用const,否则使用let
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
  • 2010-09-07
  • 2011-04-19
  • 2016-04-28
  • 1970-01-01
相关资源
最近更新 更多