Вы должны знать о подъеме в 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.
blockquote>...
" но может быть недоступен до тех пор, пока не будет оценен LexicalBinding переменной. означает, что объявление должно быть успешно завершено, прежде чем вы сможете получить доступ к переменной (либо получить значение, присвоить значение, либо сделать
typeof
, либо событиеdelete
);В вашем случае лексическая привязка переменной прерывается исключением.
let a = werwr // Uncaught ReferenceError: werwr is not defined
Пожалуйста, перейдите по ссылке и прочитайте об этом подробнее. Если вы найдете способ восстановить varaible
a
, скажите, пожалуйста. Спасибо, сегодня я узнал что-то новое о Javascript.
Если вы погрузитесь глубже в документы Core Data, вы найдете этот лакомый кусочек скрытым:
[[self managedObjectContext] processPendingChanges];
[[[self managedObjectContext] undoManager] disableUndoRegistration];
// Do your work
[[self managedObjectContext] processPendingChanges];
[[[self managedObjectContext] undoManager] enableUndoRegistration];
Изменения не регистрируются менеджером отмены обычно до конца цикла событий, и поэтому регистрировались после , вы снова отменили регистрацию. Вышеуказанное заставляет его возникать, когда вы хотите.