GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing developer.mozilla.org — Функции - JavaScript | MDN This page was translated from English by the community. Learn more and join the MDN Web Docs community.
ФункцииФункции в JavaScriptФункции - ключевая концепция в JavaScript. Важнейшей особенностью языка является поддержка функции первого класса (functions as first-class citizen). Любая функция это объект, и следовательно ею можно манипулировать как объектом, в частности:
Это определяет высокую выразительную мощность JavaScript и позволяет относить его к числу языков, реализующих функциональную парадигму программирования. Функция в JavaScript специальный тип объектов, позволяющий формализовать средствами языка определённую логику поведения и обработки данных. Для понимания работы функций необходимо (и достаточно?) иметь представление о следующих моментах:
Объявление функцийФункции вида "function declaration statement"Объявление функции (function definition, или function declaration, или function statement) состоит из ключевого слова
Например, следующий код объявляет простую функцию с именем js Функция js Примитивные параметры (например, число) передаются функции значением; значение передаётся в функцию, но если функция меняет значение параметра, это изменение не отразится глобально или после вызова функции. Если вы передадите объект как параметр (не примитив, например, js Функции вида "function definition expression"Функция вида "function declaration statement" по синтаксису является инструкцией (statement), ещё функция может быть вида "function definition expression". Такая функция может быть анонимной (она не имеет имени). Например, функция js Однако, имя может быть и присвоено для вызова самой себя внутри самой функции и для отладчика (debugger) для идентифицированные функции в стек-треках (stack traces; "trace" — "след" / "отпечаток"). js Функции вида "function definition expression" удобны, когда функция передаётся аргументом другой функции. Следующий пример показывает функцию js В следующем коде наша функция принимает функцию, которая является function definition expression, и выполняет его для каждого элемента принятого массива вторым аргументом. js Функция возвращает: [0, 1, 8, 125, 1000]. В JavaScript функция может быть объявлена с условием. Например, следующая функция будет присвоена переменной js В дополнение к объявлениям функций, описанных здесь, вы также можете использовать конструктор Function для создания функций из строки во время выполнения (runtime), подобно Метод — это функция, которая является свойством объекта. Узнать больше про объекты и методы можно по ссылке: Работа с объектами. Вызовы функцийОбъявление функции не выполняет её. Объявление функции просто называет функцию и указывает, что делать при вызове функции. Вызов функции фактически выполняет указанные действия с указанными параметрами. Например, если вы определите функцию js Эта инструкция вызывает функцию с аргументом 5. Функция вызывает свои инструкции и возвращает значение 25. Функции могут быть в области видимости, когда они уже определены, но функции вида "function declaration statement" могут быть подняты (поднятие — hoisting), также как в этом примере: js Область видимости функции — функция, в котором она определена, или целая программа, если она объявлена по уровню выше. Примечание:
Это работает только тогда, когда объявлении функции использует вышеупомянутый синтаксис (т.е. js Аргументы функции не ограничиваются строками и числами. Вы можете передавать целые объекты в функцию. Функция Функция может вызвать саму себя. Например, вот функция рекурсивного вычисления факториала: js Затем вы можете вычислить факториалы от одного до пяти следующим образом: js Есть другие способы вызвать функцию. Существуют частые случаи, когда функции необходимо вызывать динамически, или поменять номера аргументов функции, или необходимо вызвать функцию с привязкой к определённому контексту. Оказывается, что функции сами по себе являются объектами, и эти объекты в свою очередь имеют методы (посмотрите объект Область видимости функций(function scope) Переменные объявленные в функции не могут быть доступными где-нибудь вне этой функции, поэтому переменные (которые нужны именно для функции) объявляют только в scope функции. При этом функция имеет доступ ко всем переменным и функциям, объявленным внутри её scope. Другими словами функция объявленная в глобальном scope имеет доступ ко всем переменным в глобальном scope. Функция объявленная внутри другой функции ещё имеет доступ и ко всем переменным её родительской функции и другим переменным, к которым эта родительская функция имеет доступ. js Scope и стек функции(function stack) РекурсияФункция может вызывать саму себя. Три способа такого вызова:
Для примера рассмотрим следующие функцию: js Внутри функции (function body) все следующие вызовы эквивалентны:
Функция, которая вызывает саму себя, называется рекурсивной функцией (recursive function). Получается, что рекурсия аналогична циклу (loop). Оба вызывают некоторый код несколько раз, и оба требуют условия (чтобы избежать бесконечного цикла, вернее бесконечной рекурсии). Например, следующий цикл: js можно было изменить на рекурсивную функцию и вызовом этой функции: js Однако некоторые алгоритмы не могут быть простыми повторяющимися циклами. Например, получение всех элементов структуры дерева (например, DOM) проще всего реализуется использованием рекурсии: js В сравнении с функцией Также возможно превращение некоторых рекурсивных алгоритмов в нерекурсивные, но часто их логика очень сложна, и для этого потребуется использование стека (stack). По факту рекурсия использует stack: function stack. Поведение стека можно увидеть в следующем примере: js Вложенные функции (nested functions) и замыкания (closures)Вы можете вложить одну функцию в другую. Вложенная функция (nested function; inner) приватная (private) и она помещена в другую функцию (outer). Так образуется замыкание (closure). Closure — это выражение (обычно функция), которое может иметь свободные переменные вместе со средой, которая связывает эти переменные (что "закрывает" ("close") выражение). Поскольку вложенная функция это closure, это означает, что вложенная функция может "унаследовать" (inherit) аргументы и переменные функции, в которую та вложена. Другими словами, вложенная функция содержит scope внешней ("outer") функции. Подведём итог:
Следующий пример показывает вложенную функцию: js Поскольку вложенная функция формирует closure, вы можете вызвать внешнюю функцию и указать аргументы для обоих функций (для outer и innner). js Сохранение переменныхОбратите внимание, значение Это не отличается от хранения ссылок в других объектах, но часто менее очевидно, потому что не устанавливаются ссылки напрямую и нельзя посмотреть там. Несколько уровней вложенности функций (Multiply-nested functions)Функции можно вкладывать несколько раз, т.е. функция (A) хранит в себе функцию (B), которая хранит в себе функцию (C). Обе функции B и C формируют closures, так B имеет доступ к переменным и аргументам A, и C имеет такой же доступ к B. В добавок, поскольку C имеет такой доступ к B, который имеет такой же доступ к A, C ещё имеет такой же доступ к A. Таким образом closures может хранить в себе несколько scope; они рекурсивно хранят scope функций, содержащих его. Это называется chaining (chain — цепь; Почему названо "chaining" будет объяснено позже) Рассмотрим следующий пример: js В этом примере C имеет доступ к
В обратном порядке, однако, это не верно. Конфликты имён (Name conflicts)Когда два аргумента или переменных в scope у closure имеют одинаковые имена, происходит конфликт имени (name conflict). Более вложенный (more inner) scope имеет приоритет, так самый вложенный scope имеет наивысший приоритет, и наоборот. Это цепочка областей видимости (scope chain). Самым первым звеном является самый глубокий scope, и наоборот. Рассмотрим следующие: js Конфликт имени произошёл в инструкции Замыкания(Closures) Closures это один из главных особенностей JavaScript. JavaScript разрешает вложенность функций и предоставляет вложенной функции полный доступ ко всем переменным и функциям, объявленным внутри внешней функции (и другим переменным и функции, к которым имеет доступ эта внешняя функция). Однако, внешняя функция не имеет доступа к переменным и функциям, объявленным во внутренней функции. Это обеспечивает своего рода инкапсуляцию для переменных внутри вложенной функции. Также, поскольку вложенная функция имеет доступ к scope внешней функции, переменные и функции, объявленные во внешней функции, будет продолжать существовать и после её выполнения для вложенной функции, если на них и на неё сохранился доступ (имеется ввиду, что переменные, объявленные во внешней функции, сохраняются, только если внутренняя функция обращается к ним). Closure создаётся, когда вложенная функция как-то стала доступной в неком scope вне внешней функции. js Более сложный пример представлен ниже. Объект с методами для манипуляции вложенной функции внешней функцией можно вернуть (return). js В коде выше переменная js Однако есть ряд подводных камней, которые следует учитывать при использовании замыканий. Если закрытая функция определяет переменную с тем же именем, что и имя переменной во внешней области, нет способа снова ссылаться на переменную во внешней области. js Использование объекта argumentsОбъект arguments функции является псевдо-массивом. Внутри функции вы можете ссылаться к аргументам следующим образом: js где С помощью объекта Для примера рассмотрим функцию, которая конкатенирует несколько строк. Единственным формальным аргументом для функции будет строка, которая указывает символы, которые разделяют элементы для конкатенации. Функция определяется следующим образом: js Вы можете передавать любое количество аргументов в эту функцию, и он конкатенирует каждый аргумент в одну строку. js Примечание:
Рассмотрите объект Параметры функцииНачиная с ECMAScript 2015 появились два новых вида параметров: параметры по умолчанию (default parameters) и остаточные параметры (rest parameters). Параметры по умолчанию (Default parameters)В JavaScript параметры функции по умолчанию имеют значение В прошлом для этого было необходимо в теле функции проверять значения параметров на js С параметрами по умолчанию проверка наличия значения параметра в теле функции не нужна. Теперь вы можете просто указать значение по умолчанию для параметра js Для более детального рассмотрения ознакомьтесь с параметрами по умолчанию. Остаточные параметры (Rest parameters)Остаточные параметры предоставляют нам массив неопределённых аргументов. В примере мы используем остаточные параметры, чтобы собрать аргументы с индексами со 2-го до последнего. Затем мы умножим каждый из них на значение первого аргумента. В этом примере используется стрелочная функция (Arrow functions), о которой будет рассказано в следующей секции. js Стрелочные функции(Arrow functions) Стрелочные функции — функции вида "arrow function expression" (неверно fat arrow function) — имеют укороченный синтаксис по сравнению с function expression и лексически связывает значение На введение стрелочных функций повлияли два фактора: более короткие функции и лексика Более короткие функцииВ некоторых функциональных паттернах приветствуется использование более коротких функций. Сравните: js Лексика
|
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |