JavaScript: реализовать работу с var - PullRequest
4 голосов
/ 18 февраля 2020

Итак, у меня есть код, который клонирует поведение let. Но я не понимаю, как и почему это работает. Кто-нибудь может это объяснить?

(function() {
  var a = 2;
})()

Ответы [ 2 ]

7 голосов
/ 18 февраля 2020

let относится к блоку, в котором он появляется.

var относится к функции, в которой он появляется.

Путем замены блока функцией (которая сразу var ограничен теми же строками кода, что и let.

3 голосов
/ 18 февраля 2020

Если вы можете использовать только переменные 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 вы можете прочитать в на этот вопрос и ответы на него .

...