От автора: JavaScript позволяет создавать, кроме обычных, также и анонимные функции, выполняющие важную роль в JavaScript.
Анонимность каждый день
Вы, скорее всего, уже встречались с анонимными функциями. Они входят в колбэк функции.
1 2 3 4 |
document.getElementById("button").addEventListener("click", function (){ ... }) |
У функции в обработчике события нет имени, она анонимна. Анонимные функции зачастую создаются и сразу же запускаются, так как находятся внутри колбэк функций. Еще одно важное отличие в том, что именованные функции объявляются, а анонимные создаются при помощи оператора function. Анонимные функции могут выступать в качестве значения переменной:
1 2 3 |
var luke = function() { // используй силу } |
Таким образом, к функции можно обращаться по переменной, но сама функция остается анонимной. В качестве значения переменной также можно указать именованную функцию. С анонимными функциями все то же самое, они даже лучше подходят для таких целей.
Отличие от обычных функций
Важное отличие анонимных функций в том, что они должны объявляться до их вызова. Можете вспомнить нашу первую статью в серии. Там сказано, что обычные функции можно объявлять и вызывать в любом месте. Браузер парсит код перед его выполнением, подхватывая именованные функции по пути. Сам факт того, что функции должны прописываться в начале скрипта, лишь условность и хорошая практика программирования. Анонимная функция создается в момент ее запуска в скрипте, не во время парсинга, поэтому ее нельзя прописать после ее вызова в коде.
Способы применения анонимных функций
У анонимных функций нет имени, поэтому они короче и их легче писать, если вам не нужно ссылаться на них в коде. По этой причине их и используют в колбэк функциях. Есть еще одна интересная особенность: в определенной записи такие функции могут вызывать сами себя.
1 2 3 |
(function() { // код выполняется автоматически })(); |
Техника называется самовыполняющиеся функции. Эффект создается пустыми скобками в конце функции, которые говорят браузеру, что эту функцию необходимо запустить как можно быстрее. Такая запись может показаться лишней, обычный JS также запустит функцию, когда дойдет до нее в коде. Так зачем использовать такую странную запись?
Главная причина – область видимости функции. Можете вспомнить из прошлой статьи, что переменная, объявленная внутри функции, может быть вызвана только внутри этой функции. В остальном коде данная переменная не видна. Точно так же переменная внутри самовыполняющейся функции замыкается внутри этой функции. Такую переменную нельзя случайно вызвать из внешнего кода или переписать. Такая техника аккуратно инкапсулирует переменные и код, пряча их от глобального пространства имен, чтобы они не вступили в конфликт с другим кодом. По такой же схеме часто пишутся полифилы и плагины, в виде самовыполняющихся функций.
Заключение
Поняв суть анонимных и самовыполняющихся функций, вы сможете передавать функции в переменных и перестроить код по модулям. Функции такого рода можно использовать также и для создания и возврата других функций. Тут речь уже заходит о замыкании, о котором мы поговорим в следующей статье.
Источник: //thenewcode.com/
Редакция: Команда webformyself.