Страницы

Поиск по вопросам

суббота, 8 февраля 2020 г.

Именованные функциональные выражения (Named Function Expression)

#javascript


Что выведется в консоль при выполнении этого кода? Почему?

(function test() { test = 123; console.log( test ); }())


В консоль выведется эта функция:

function test() { test = 123; console.log( test ) ;} 


Почему так происходит?
    


Ответы

Ответ 1



Согласно этой статье, перезаписать имя NPE, доступное внутри самого NPE и используемое для рекурсивного вызова (вместо устаревшего arguments.callee), нельзя. В MDN, к сожалению, про запрет переписывания ничего не сказано, однако практика (ваш пример) говорит о том, что это всё же верное утверждение. Поэтому test = 123; не даёт никакого эффекта, и console.log выводит первоначальное значение test - само NPE.

Ответ 2



В стандарте описан процесс вычисления именованного функционального выражения Внутри тела имя функционального выражения будет являться immutable binding и при включенном Strict Mode при попытке изменить его будет ошибка времени выполнения. Так как у вас не используется "use strict"; Strict Mode выключен и присваивание просто игнорируется. Чтобы на консоль вывелось ожидаемое значение необходимо объявить test локально с помощью ключевого слова var (function test() { var test = 123; console.log( test ); }())

Комментариев нет:

Отправить комментарий