Javascript ES6 'let' и 'var' - неожиданное поведение внутри функции с именем аргумента, совпадающим с объявленной переменной - PullRequest
0 голосов
/ 31 мая 2019

Обратите внимание, что это не является дубликатом существующего var и let scope. Я знаю о возможностях var и let, объявлениях и различиях.

Но по приведенному ниже сценарию я не смог оправдать свое понимание разницей let и var.

В приведенном ниже коде функция foo принимает аргумент с именем 'x', который имеет неявную область действия let - поскольку я не могу переопределить то же имя переменной, используя let внутри этой функции (раскомментируя последнюю строку в функции foo выдаст ошибку JS)

"use strict";

function foo(x) {
    console.log('Inside function x:', x);
    var x = 30; // 'x' redeclared overwriting argument/parameter 'x'
    console.log('Redeclared x:', x);
    // let x = 400; // uncommenting this line throws error even if you remove 'var x = 30;'
}

foo(100);
// global
let y = 100;
console.log('y:', y);
// var y = 300;

Выполнение приведенного выше кода с двумя закомментированными строками работает отлично, и вы можете увидеть результат в виде:

Inside function x: 100      index.js:4 
Redeclared x: 30            index.js:6
y: 100                      index.js:13

Раскомментирование последней строки // var y = 300; выдаст ошибку.

Вопрос : почему повторное выделение «x» с использованием «var» внутри функции foo работает, но выдает ошибку, если «y» повторно объявлено в глобальной области видимости с использованием «var»

1 Ответ

1 голос
/ 31 мая 2019

Синтаксис объявления var является оригинальным для языка и имеет довольно строгие правила.Декларации let и const являются более новыми и более строгими.Вы не можете повторно объявить переменные с let или const независимо от того, как они были объявлены в первую очередь.И если переменная объявлена ​​с let или const, последующее объявление var также является ошибкой.

Объявления через let и const не разрешат ссылки на переменные до того, какзаявление;вот почему вы получаете ошибку, упомянутую в вашем первом примере.Другими словами,

console.log(x);
let x = 0;

является ошибкой, поскольку на объявление x ссылаются до объявления.

...