Почему функции JavaScript всегда возвращают значение?
Я прохожу курс по программированию на JavaScript, и инструктор сказал, что типичная функция JavaScript всегда возвращает значение. Даже если мы не укажем явное значение для возврата, движки возвращают undefined
.
Это действительно так? Если да, то почему?
2 ответ(ов)
Да, это верно. Фактически, когда функция не содержит явного оператора возврата, она действительно возвращает undefined
. По сути, если вы присвоите переменной результат вызова такой функции, то результат будет равен undefined
.
Редактирование
Я ошибся в своем первоначальном ответе. Вот соответствующий раздел спецификации:
13.2.1 [[Call]]
Когда внутренний метод [[Call]] для объекта функции F вызывается с указанным значением this и списком аргументов, выполняются следующие шаги:
- Пусть funcCtx будет результатом создания нового контекста выполнения для кода функции с использованием значения внутреннего свойства [[FormalParameters]] F, переданного списка аргументов и значения this, как описано в 10.4.3.
- Пусть result будет результатом выполнения тела функции, которое является значением внутреннего свойства [[Code]] F. Если у F нет внутреннего свойства [[Code]] или его значение – это пустое тело функции, то result равно (normal, undefined, empty).
- Выйдите из контекста выполнения funcCtx, восстанавливая предыдущий контекст выполнения.
- Если тип result — throw, то выбросьте result.value.
- Если тип result — return, то верните result.value.
- В противном случае тип result должен быть normal. Верните undefined.
Таким образом, в случае отсутствия явного возврата функция завершает выполнение, и JavaScript возвращает undefined
автоматически.
В JavaScript функции действительно являются объектами. Поэтому вы всегда можете присвоить функцию переменной так же, как присваиваете любой другой объект. Интерпретатор в этом случае будет определять значение переменной (которое может быть undefined
). Например:
function myFunction() {
console.log("Hello, World!");
}
const myVar = myFunction; // Присваиваем функцию переменной
myVar(); // Вызовем функцию через переменную, получится вывод: "Hello, World!"
Если вы не присвоите функцию никакой переменной, она по-прежнему существует в памяти, но к ней будет сложно получить доступ, и вы получите undefined
, если попытаетесь обратиться к ней по переменной, которая не была определена.
Где найти документацию по форматированию даты в JavaScript?
Как определить нажатие клавиши Esc?
Как проверить, содержит ли массив строку в TypeScript?
Ссылка и выполнение внешнего JavaScript-файла, размещенного на GitHub
Как остановить Babel от трансформации 'this' в 'undefined' и добавления "use strict"