Функции в javascript. Урок 1. Основы

Оглавление цикла уроков по функциям в javascript.

Правильное понимание механизма работы функций в javascript — одно из самых важных качеств, необходимых опытным программистам на этом языке.

Варианты объявления функции

Обычно начинающие javascript-программисты пишут определение функции таким образом:

Но функции в Javascript — это объекты, а любые объекты можно присваивать переменной, в случае функции это может выглядеть так:


Я не описался, поставив точку с запятой в конце, это нужно делать после любых присвоений, это ничем не отличается от var intVar = 1;. Да, конечно, javascript допускает запись без «;», размещая операторы каждый с новой строки, но не стоит этим злоупотреблять: если вы, например, захотите сжать код, удалив для начала все лишние пробелы и переносы строк, то непременно натолкнетесь на синтаксическую ошибку кода. Поэтому ставьте точку с запятой везде, где это необходимо.

А что, если мы не поставим «var» в начале? Как известно, это меняет область видимости переменной, она становится «глобальной», точнее, такое определение будет равнозначно следующему (в случае выполнения кода в браузере):

Чем же отличаются первое и второе определения функции? «Версия для начинающих» и «версия с var» почти идентичны, за исключением двух небольших нюансов. Во-первых, в случае, когда мы обходимся простой декларацией функции, она не только неявно присваивается переменной с таким же именем, но становится еще и именованной, то есть в поле name (мы помним, что функция — это объект) сохраняется ее имя:

На самом деле ничто не мешает нам создать именованную функцию и при втором варианте объявления, причем, имя переменной не обязано совпадать с именем функции:

Более важное отличие состоит в том, что в первом случае функцию можно вызывать до ее объявления внутри контекста (хотя я рекомендую всегда объявлять функции до их использования) — это так называемое поднятие функций:

сравним с этим:

Локальные и глобальные функции

Следует еще учитывать, что при создании функций «простым» способом, они будут локальными, например:

Поможет в данном случае третий вариант определения:

Либо можно сначала во внешнем контексте объявить переменную, а затем присвоить ей значение во внутреннем контексте, это поможет не засорять глобальный контекст:

Но следующий код все равно вызовет ошибку, потому что хоть переменная и определена во внешнем контексте, внутри wrapFunc() она перекроется локальной переменной someFunc и внешняя переменная останется нетронутой, в ней не будет функции:

Передача функций как обычных переменных

Как уже говорилось выше, функция — это тоже объект, и этот объект легко можно, например, передать другой функции:

Можно даже просто передать анонимную функцию, не присваивая ее переменной:

Замыкания

Естественно, функцию можно и вернуть из другой функции. Причем, возвращаемая функция будет иметь доступ ко всем переменным, доступным внутри контекста, где она была определена (локальным и внешним). Это крайне полезное свойство называется замыканием. Вот пример:

В этом примере видно, что хотя переменная text и определена как локальная в функции factory(), она доступна для возвращаемой функции внутри созданного для нее замыкания. Замыкания — незаменимая вещь при работе с обработчиками событий, асинхронных ajax-запросах и т.п.

Переменная arguments

Напоследок упомяну, что когда вы вызываете функцию, в контексте ее выполнения автоматически создается переменная arguments, содержащая, как нетрудно догадаться, список аргументов, переданных функции, причем, их количество не обязано совпадать с количеством параметров, указанных в декларации функции. Переменная arguments выглядит почти как массив, аргументы доступны по ключам от 0 до n-1 (где n — количество переданных аргументов), даже имеет поле length, но на самом деле это не массив, например, у нее нет метода join() и других. Кроме того, у arguments задано поле callee, содержащее ссылку на выполняемую в данный момент функцию (она ведь объект :)). Проиллюстрируем на примере:

В следующем уроке речь пойдет о ключевом слове this внутри функции на javascript и о его отличии от собратьев из других языков программирования.

Оглавление цикла уроков по функциям в javascript.

Добавить комментарий