Это O.K.?
Главным образом; возможно полностью. Есть очень несколько ситуаций, в которых вы хотите использовать var
вместо let
/ const
по техническим (а не по стилю) причинам:
Если вы хотите объявить глобальную переменную, которая становится свойством глобального объекта (глобальные let
, const
и class
создают глобальные переменные, но они не становятся свойствами глобального объекта ).
Конечно, вы могли бы использовать this.varName = ...
вместо var varName
, поскольку this
в глобальном масштабе¹ является глобальным объектом.
Если вы хотите иметь несколько файлов, где любой из них может быть «первым» (но не последним) для определения того же глобального, как это обычно бывает в более старых форматах модулей, например ::
var MyApp = MyApp || {};
MyApp.something = /*...*/;
Это работает, потому что часть var MyApp
игнорируется, если MyApp
уже объявлено; эквивалентная структура с let
потерпит неудачу, потому что ее нельзя использовать, если идентификатор уже объявлен в текущей области.
Конечно, вы, вероятно, уже используете новый формат модуля. :-) А если нет, снова вы могли бы сделать
this.MyApp = this.MyApp || {};
MyApp.something = /*...*/;
в глобальном масштабе. ¹
[Там использовал для незначительного выигрыша в производительности при использовании var
вместо let
в функции, где он использовался в качестве счетчика цикла. Последние версии современных браузеров почти исключают эту незначительную выгоду (и она в любом случае была незначительной).]
¹ Обратите внимание, что код верхнего уровня в модуле (модуль ES2015, модуль Node.js, большинство сборщиков ...) в глобальном масштабе равен , а не . Это в рамках модуля. Также обратите внимание, что на верхнем уровне модуля ES2015 this
имеет значение undefined
.