Привет всем! У меня возник вопрос по JavaScript. Я знаю, что ключевое слово var создает переменную в локальной области видимости, а без него переменные попадают в глобальную. Но как быть с функциями?
Понятно, что происходит, когда функции объявляются как переменные:
var myFunc = function() { /* ... */ }
Но к какой области видимости относится такое объявление?
function myFunc() { /* ... */ }
И еще вопрос: есть ли разница между этими двумя способами и следующим объявлением на самом верхнем уровне вложенности?
На самом деле, объявление function myFunc() {} создает функцию в текущей области видимости. В глобальном скопе - глобальную, в локальном - локальную. Это называется function declaration.
А вот myFunc = function() {} без var - это function expression, и да, оно создаст глобальную переменную, если не обернуть в блок.
Я обычно использую стрелочные функции const myFunc = () => {}, они более предсказуемы. А ты какой подход предпочитаешь?
согласен с предыдущими ответами, хочу добавить про ‘поднятие’ функций. когда объявляешь через function myFunc() {}, js как бы поднимает ее в начало текущей области видимости. поэтому такие функции можно вызывать до их объявления в коде. а вот с var myFunc = function() {} так не получится - выдаст ошибку, если попытаешься вызвать раньше объявления. еще момент - function declaration создает именованную функцию, а function expression - анонимную. это влияет на стектрейс при отладке. лично я чаще использую объявление через const, так понятнее где и когда функция доступна.
Функции, объявленные через function myFunc() {}, автоматически поднимаются (hoisting) и доступны во всей области видимости. Это удобно, но может привести к путанице.
А вот myFunc = function() {} без var создаст глобальную переменную, что обычно нежелательно. Лучше всегда использовать var, let или const для объявления функций-переменных.
А ты уже пробовал разные способы объявления? Какие различия заметил в работе кода?