Javascript Uncaught ReferenceError при копировании объекта [дубликат]

С Python 3.6 вы можете использовать f-строки:

list_ = [9.0, 0.052999999999999999, 
         0.032575399999999997, 0.010892799999999999, 
         0.055702500000000002, 0.079330300000000006]

print(*[f"{element:.2f}" for element in list_])
#9.00 0.05 0.03 0.01 0.06 0.08

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

print(*[f"{element:.2f}" for element in list_], sep='|', end='<--')
#9.00|0.05|0.03|0.01|0.06|0.08<--
11
задан whales 21 December 2016 в 09:56
поделиться

2 ответа

Это происходит, когда вы вводите временную мертвую зону в глобальную область. Как вы можете знать, let объявления подняты, но оставлены неинициализированными . Из-за потока управления может случиться, что переменная никогда не инициализируется:

function …() {
    if (false)
        example; // would throw a ReferenceError if it was evaluated
    … // do something
    if (true)
        return; // stop!
    let example = 5; // never executed
}

Это прекрасно в области функций. Возможно, что-то пошло не так, возможно, переменная не нужна вообще - в следующем вызове будет создана новая область с новой переменной.

Аналогичная вещь может произойти в глобальной области, когда вы генерирует исключение, прежде чем инициализируется переменная (только исключения работают здесь как конструкция потока управления, ничто иное не достигает такого же эффекта).

throw new Error;
let example = 5;

В отличие от области функции, здесь имеет значение, что переменная остается неинициализированной. Глобальный охват длится вечно, и переменная вечно мертва. Это не было и никогда не будет инициализировано, и лексические переменные не могут быть повторно объявлены (что помогает предотвратить ошибки).

Этот обсуждался на es-discuss , но считался несущественным. Если выполнение верхнего уровня <script> вызывает ошибку, у вас больше проблем, чем неинициализированных переменных. Нет пути для восстановления. Если вам это нужно (например, путем повторного объявления его в последовательных сценариях), вы все равно должны использовать var.

У вас такая же проблема в консоли devtools - это немного неприятность , но может быть решена для консоли как специальная область.

9
ответ дан Community 15 August 2018 в 23:50
поделиться
  • 1
    Учитывая, что let hoist, я написал код следующим образом: & quot; пусть х; выбросить новую ошибку; x = 6 " в этом случае x может быть переназначен позже. Есть ли какая-то тонкая разница между "вручную" поднять заявления объявления против неявной реализации? Я добавил ответы на вопрос с лучшим форматом – whales 21 December 2016 в 09:54
  • 2
    Да, let x; является ярлыком для let x = undefined;, и если вы поместите его в верхнем ручном режиме, вы инициализируете переменную до того, как будет выбрано исключение. – Bergi 21 December 2016 в 13:37
  • 3
    Re & quot; Нет пути для восстановления & quot ;, в будущем он сможет <script onerror – Pacerier 23 November 2017 в 22:46
  • 4
    @Pacerier Вы можете обработать ошибку (уже сегодня с window.onerror) и зарегистрировать ее, но вы не можете восстановить ее. Невозможно отменить то, что сценарий сделал до выброса исключения, и невозможно объявить переменную. – Bergi 23 November 2017 в 22:54

Вы должны знать о подъеме в JS. В принципе, такое объявление, как let a = werwr;

, интерпретируется как let a; a = werwr;

. И почему он уже объявлен при запуске второй строки кода.

UPDATE

Итак, в спецификациях ES есть [ПРИМЕЧАНИЕ] в спецификациях ES https://tc39.github.io/ecma262/#prod-LetOrConst

let и const объявляют переменные, которые привязаны к LexicalEnvironment исполняемого контекста выполнения. Переменные создаются, когда их содержащая Лексическая среда создается, но может быть недоступна каким-либо образом, пока не будет оценена LexicalBinding переменной. Переменной, определяемой LexicalBinding с инициализатором, присваивается значение его AssignmentExpression Initializer при анализе LexicalBinding, а не при создании переменной. Если LexicalBinding в объявлении let не имеет инициализатора, переменной присваивается значение undefined при оценке LexicalBinding.

...

" но может быть недоступен до тех пор, пока не будет оценен LexicalBinding переменной. означает, что объявление должно быть успешно завершено, прежде чем вы сможете получить доступ к переменной (либо получить значение, присвоить значение, либо сделать typeof, либо событие delete);

В вашем случае лексическая привязка переменной прерывается исключением.

let a = werwr // Uncaught ReferenceError: werwr is not defined

Пожалуйста, перейдите по ссылке и прочитайте об этом подробнее. Если вы найдете способ восстановить varaible a, скажите, пожалуйста. Спасибо, сегодня я узнал что-то новое о Javascript.

1
ответ дан vothaison 15 August 2018 в 23:50
поделиться
  • 1
    если это так, я должен был бы сделать & quot; a = & quot; законна строка & quot ;, но он забросил ошибку, которая не определена. также, если я пишу инструкции отдельно, как вы, я мог бы переназначить a. Однако в моем случае это не происходит – whales 21 December 2016 в 05:47
  • 2
    Вы правы, моим последним объяснением теперь является инструмент разработчика Chrome, который запускает ваш скрипт с помощью eval (). Я пытаюсь сделать пример из этого. Но, с let внутри eval () .... Ну. Удачи. – vothaison 21 December 2016 в 06:06
  • 3
    спасибо за проведение исследования. Ответ Берги был довольно тщательным, если вы заинтересованы – whales 21 December 2016 в 09:24
  • 4
    большое спасибо ... – vothaison 21 December 2016 в 09:29
Другие вопросы по тегам:

Похожие вопросы: