Функціональний javascript - все про web розробці на

процедурні функції

На початку були функції ...

Майже кожна мова програмування має конструкцію подібну цій. Кожен програміст в світі знайомий з цим синтаксисом. "Hello" це ім'я нашої функції, але що станеться, якщо ми створимо helloтак ж, як і змінну?

Функції як змінні

Це може бути трохи незнайомим синтаксисом, але більшості програмістів має бути комфортно працювати з функцією, яка визначена як змінна.

Вона буде мати ті ж можливості і може бути передана як параметр функцій, як і будь-яка інша змінна.

Передача функцій функцій

Якщо ми оголошуємо "hello" як змінну, то ми можемо передати її як параметр для функції.

Є два способи використання функції як аргумент. Ви можете передати покажчик на саму функцію, або ви можете виконати функцію, яка сама поверне функцію. У наведеному вище прикладі передається покажчик "hello" в змінну "what" в функції "say". "What" стала дороговказом на "hello".

Цей приклад "вішає" обробник "doSomething" на подію onclick. Тому що ми використовуємо лише ім'я функції а не її виклик. З іншого боку якби "doSomething ()" теж повертала функцію то все як і раніше б працювало добре.

Анонімні функції

Це створить обробник події натискання кнопки миші. При натисканні кнопки відбудеться виклик цієї функції, вона є анонімною, тому що ми не оголошуємо її ім'я, і ​​не можемо викликати її пізніше інакше ніж через onmousedown.

Само-виклик функції

Подивіться на наступний код

Зверніть увагу що "x" буде містити не анонімну функцію, а результат її роботи. Анонімна функція існувала рівно стільки щоб передати результат своєї роботи в змінну "x".

Ось більш реальний приклад:

Функція створює елемент script на сторінці і завантажує в нього сторонній сценарій. При цьому сама функція не існує після свого виконання і не займає пам'ять. Це дуже зручно, наприклад, коли функція потрібна всього один раз і немає бажання придумувати для неї назву.

Ви також можете використовувати саме-виклик анонімної функції коли вам потрібно зробити обробку будь-яких даних перш ніж подати їх в функцію.

У цьому прикладі, викликається звичайний doAlert, але викликається з використанням анонімної само-викликає функцію в якості параметрів. Зрозуміло таким чином викликати можна не тільки анонімні функції:

Що еквівалентно традиційного викликом функцій в інших мовах програмування

Забігаючи вперед скажу що висновок будь-якого коду в функцію, обмежує область видимості її змінних, що дуже зручно для спільного використання різних бібліотек (jQuery, Prototype).

Більшість полігонів jQuery написані подібним чином, що дозволяє застосовувати їх максимально сумісно з іншими фреймворками. Але зрозуміло нічого не заважає вам писати в тому ж стилі і на prototype.

Розуміння покажчика на функцію

Мінлива copiedFunction це покажчик на блок пам'яті в якому лежить функція originalFunction "hello world". Коли ми пізніше змінюємо оригінальну функцію на 'goodbyeworld' то copiedFunction повертає покажчик на оригінальну функцію "hello world".

Область видимості функції

Застереження: Якщо ви оголошуєте нову змінну без ключового слова "var" то така змінна є одним з властивостей глобального об'єкта windowі доступна глобально.

Крім того функцію можна викликати як window.subFunction ();

Функція як Об'єкт

myАггау є об'єктом, який має властивості і методи, загальні для всіх масивів і який можна розширити. Коли ми перебираємо в циклі myArray ми отримаємо тільки [1] [2] [3] (1,2,3), властивості ( 'one', 'two', 'three') не є частиною масиву вони лише властивості його об'єкта. Щоб не вийти за межі масиву myArray ми використовували властивість .length щоб знайти кількість елементів в ньому.

Функція Об'єкти і методи

Кожна функція має такі властивості:

arguments - масив / об'єкт, що містить аргументи, що передаються функції

arguments.length - Зберігає число аргументів в масиві

arguments.callee - покажчик на виконувану функцію (дозволяє використовувати анонімні функції рекурсивно).

length - число очікуваних аргументів функції myFunc (х, у) = 2.

constructor - покажчик на функцію конструктор.

prototype - дозволяє створювати прототипи функцій для всіх об'єктів.

Кожна функція має такі методи:

apply - метод, який дозволяє більш просто передати аргументи функції (аргументи подаються вигляді масиву, і при 'тому дозволяє змінити глобальну область видимості функції тобто дозволяє викликати функції в іншому контексті).

call - те ж саме що і apply, тільки аргументи подаються окремо як і в звичайну функцію.

toSource - повертає вихідний текст функції у вигляді рядка.

toString - повертає вихідний текст функції у вигляді рядка.

valueOf - повертає вихідний текст функції у вигляді рядка.

Розуміння аргументів функції

Якщо є оголошена функція

Ви можете викликати функцію наступним чином.

Якщо була викликана myFunc (1) то b і c буде типу 'undefined' і ви можете побачити це кількома способами.

Як ви бачите, 'undefined' є помилкове умова, таким чином Ви можете використовувати логічні оператори, щоб виявити, якщо аргументом було встановлено і виправити це. Третій спосіб перевірки є найбезпечнішим для знаходження невизначених аргументів, так як 1 і 2 некоректно спрацюють на значення false, '' і 0.

length і arguments.length властивості дозволяють перевірити на очікувану кількість аргументів і кількість аргументів, яке насправді пройшло. наприклад:

Як ви можете бачити, функція очікує 3 аргументу, але отримала лише 1!

Використання масиву arguments

У нашому прикладі вище a, b, і c представлені змінними, які ми використовували, щоб отримати перші три аргументи. Якщо аргументів буде менше ніж очікувалося то змінні будуть встановлені як "undefined", якщо там буде більше ніж очікувалося вони будуть як і раніше доступні для нас в масиві arguments

Досвід показує що масив arguments має в повному обсязі властивості і методи доступні звичайним масивам тому якщо ви хочете використовувати методи (sort, splice, slice, і т.д.) то потрібно зробити наступне:

Як передати аргументи однієї функції іншою

Час від часу, хтось запитує, як передати аргументи однієї функції в якості аргументів для іншої. наприклад:

Тут подається 10 аргументів на myFunc і myFunc намагається передати їх otherFunc але замість цього передає його аргументи у вигляді масиву, а не як список аргументів. Ми можемо обійти це з викликом методу apply, яка буде передавати масив аргументів як список аргументів на нову функцію

Як використовувати рекурсію на анонімних функціях

висновок

Функціональний javascript - все про web розробці на

Платна консультація з питань 1500 руб / год