首页 > 解决方案 > 我可以完全停止使用 var 吗?

问题描述

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

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

这个可以吗?

标签: javascriptecmascript-6

解决方案


这个可以吗?

大多; 可能完全。出于技术(而不是风格)原因,在少数情况下您希望使用/来var代替:letconst

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

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

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

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

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

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

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

    在全球范围内。¹

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


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


推荐阅读