Что вызывает различное поведение между «var» и «let», когда присваивает им возвращаемое значение функции, которая выдает ошибку - PullRequest
0 голосов
/ 17 января 2019

Пожалуйста, найдите код на изображении ниже.1. Присвойте возвращаемое значение функции, которая фактически выдает ошибку, переменной «withLet», объявленной с использованием ключевого слова «let».2. вызвать 'withLet', произошла ошибка: 'withLet не определен'.3. попытайтесь утвердить 'withLet', используя 'let', ошибка показывает, что 'withLet' уже объявлен.

Но парадокса для 'var' не существует (пожалуйста, найдите на следующем рисунке).

Мне любопытно, что вызвало различное поведение между этими двумя ситуациями.Совершенно очевидно, что «не определено» и «уже объявлено» описывают одну и ту же переменную.

let withLet = (function() {throw 'error!'})()
var withVar = (function() {throw 'error!'})()
//VM2470:1 Uncaught error!
//(anonymous) @ VM2470:1
//(anonymous) @ VM2470:1
withLet
//VM2484:1 Uncaught ReferenceError: withLet is not defined at 
//<anonymous>:1:1
//(anonymous) @ VM2484:1
withVar
//undefined
let withLet = 'sth'
//VM2520:1 Uncaught SyntaxError: Identifier 'withLet' has already been 
//declared
//at <anonymous>:1:1
//(anonymous) @ VM2520:1
withVar = 'sth'
//"sth"

Снимок экрана:

1 Ответ

0 голосов
/ 17 января 2019

Объявления переменных var поднимаются - инициализация имени переменной поднимается в верхнюю часть содержащей функции (или, если функции нет, в верхнюю часть внешнего блока). Так

var withVar = (function() {throw 'error!'})()

интерпретируется переводчиком как

var withVar;
withVar = (function() {throw 'error!'})()

То же самое не верно для let - let переменные инициализируются после запуска строки let __. Когда есть назначение, правая сторона анализируется первой; если правая часть выдает ошибку, она никогда не попадает в левую, а переменная, объявленная с let, никогда не инициализируется должным образом; он останется в демилитаризованной зоне / временной мертвой зоне навсегда , поэтому попытка переназначения выдает ошибку.

Это немного странно, потому что код запускается в консоли - обычно JS запускается внутри тега <script>, и если возникает такая ошибка, обычно не более код будет выполняться, и тот факт, что переменная, объявленная с let, больше не может быть переназначена, - это наименьшее из ваших беспокойств.

...