Если вы можете использовать только переменные var
, но хотите, чтобы объявление переменной не перезаписывало другую ранее существующую переменную с тем же именем, вы можете использовать IIFE , чтобы охватить это переменная к функции. По сути, это создает «блок», подобный второму примеру ниже.
var
переменные ограничены функциями:
var a = 1;
let b = 1;
(function() {
var a = 2;
let b = 1;
})();
console.log(a); //=> 1 (a is not overwritten because the second `var a` is function-scoped)
console.log(b); //=> 1
let
переменные распределены по блокам:
let a = 1;
var b = 1;
{
let a = 2;
var b = 2;
}
console.log(a); //=> 1 (a is not overwritten as let is block-scoped)
console.log(b); //=> 2 (b is overwritten as var is not block-scoped)
Стоит отметить, что вы можете переопределить переменную var
, поэтому можно было бы перезаписать существующую переменную var
с тем же именем. Однако вы не можете переопределить переменную let
:
var a = 1
// will not error as `var` does not prevent redeclaration
var a = 2
let b = 1
{
// will not error as `b` is not declared in this block
let b = 2
}
// will error as `b` is already declared in this scope
let b = 3
Подробнее о let
и var
вы можете прочитать в на этот вопрос и ответы на него .