Изучаем JavaScript, ч. 1: Функции: Основы работы с функциями в JavaScript
мая 11, 2011 | Published in ClientSide, JavaScript, Новости | 5 Comments
RubyDev учебник по клиентскому JavaScript
Почему именно по клиентскому? — Во-первых меня, по крайней мере пока, не интересует серверный javascript и не интересует node.js и т.п. Во-вторых, клиентский яваскрипт все-таки более популярен и конкретно он меня наибольшим образом интересует. В любом случае, если меня заинтересует серверный JavaScript и работа с Node.js, то будет выпущен соответствующий новый, отдельный цикл, уже по самой технологии, а не по самому JavaScript, поскольку отличия не существенны, это по прожнему тот же javaScript, только выполняющий работу иного характера.
Данный учебник не будет описывать работу со строками или массивами и не будет преднамеренно знакомить вас с библиотекой предопределенных «классов» и методов. Все это так потому, что целью данного учебника не является его становление справочником, но предоставление вам понимания того, что такое JavaScript, его концепций и стиля написания программ.
В этом цикле статей будет также расмотрен фреймворк jQuery, который позволяет разработчику сконцентрироваться на написании логики не отвлекаясь на кроссбраузерность и так далее. Другими словами jQuery берет на себя весь рутинный труд.
Не смотря на то, что JavaScript является объектно-ориентированным (ОО) языком программирования, для него более родственной является концепция функций.
Любая функция в JavaScript — это экземпляр класса Function. Честно признаться, в JavaScript не того, что принято называть классами. Работу классов в JavaScript выполняют функции — конструкторы (или просто конструкторы), которые создают объекты с определенными предопределенными свойствами. Ниже приведен пример использования конструктора для создания объекта типа Array:
myArray = new Array(1,2,3,4,5); //1,2,3,4,5 myArray; //1,2,3,4,5 typeof myArray; //object myArray.constructor; //возвращает конструктор Array
Пояснения:
1. Для создания новых объектов конструкторы вызываются через выражение new. Так же как и классы, функции конструкторы могут свои собственные свойства.
2. Оператор typeof используется для получения типа объекта. К сожалению он годится только для предопределенных типов: строки, числа, булевы значения. Все остальные объекты, например массивы и пользовательские объекты будут иметь тип object, что не о чем не говорит.
3. Метод constructor возвращает функцию-конструктор объекта — приемника.
Обявить функцию можно при помощи двух способов: выражения function и конструктора Function, ниже приведены примеры обоих:
function myFunction(){ alert("Hello!"); } myFunction(); //Hello var myFunction = new Function("alert(\"Bye-bye!\");"); myFunction(); //Bye-bye!
Пояснения:
1. Как видите, имя функции — это всего-лишь переменная, которая ссылается на объект функции в памяти компьютера.
2. Создание функций с использованием конструкторов — это моветон, посколько данный метод сильно сничает читабельность и использует eval для преобразования строки в код.
Часто бывает необходимо создавать безымянные функции. Для их создания просто не указывайте имени функции при ее объявлении, пример:
myFunction = function () { alert("Hello!"); } var myFunction(); // Hello!
Пояснения:
1. Здесь мы создали безымянную функцию, на которую сослались переменной myFunction.
Аргументы функций и возвращаемое значение
В JavaScript каждая функция создает в нутри себя пространство переменные объявленные в котором недоступны из внешнего мира. Единственный способ обмена информацией между функцией и внешним миром (всей программой) являются атрибуты (параметры функции) и возвращаемое значение.
Начнем с атрибутов. Атрибуты — это внутренние переменные объявленные особым образом значения которым присваиваются при вызове функции, пример:
function showMeConstructor(obj){ alert("Тип объекта: " + typeof obj); } myString = "RubyDev.ru"; showMeConstructor(myString); //Тип объекта: string
Функция может принимать несколько аргументов, при этом объявление аргументов будет происходить так же в круглых скобках и имена аргументов будут разделены запятыми.
Часто требуется создать функция с произвольным количеством аргументов или с необязательными аргументами. Если в Ruby существует специальный синтаксис для объявления таких аргументов, то в JavaScript вам необходимо писать специальный обработчик, пример функции с необязательным (предопределенным) аргументом:
function exampleFunction(a,b) { if (!b) { var b = 0;}; alert(a * b); } exampleFunction(100, 5); //500 exampleFunction(100); //0
Пояснения:
1. В примеры выше мы написали код проверяющий объявлена ли переменная b; если переменная b не объявлена.мы объявляем ее и присваиваем значение по умолчанию — 0.
Для создания функций с произвольным (предварительно неизвестным количеством аргументов) не нужно ничего изобретать, все аргументы передаваемые в функцию при ее вызове хранятся в специальном массиве arguments в порядке их передачи в функцию. Пример:
function exampleFunction(a,b) { var mult = a * b; for ( var n = 2; n < arguments.length; n++){ mult += arguments[n]; } alert(mult); } exampleFunction(100, 5, 1,2,3); //506 exampleFunction(100, 2, 7); //207
Пояснения:
1. Функция в примере выше умножает первые два аргумента, а затем к их произведению прибавляет все остальные переданные значения.
2. arguments, на самом деле, является псевдо-массивом. Вы не можете воспользоваться методами pop, push, shift и unshift для удаления и добавления новых элементов. Все, что вам доступно — это получение значений переданных в функцию параметров.
Мы разобрались с аргументами функции, теперь нам следует разобраться со значениями, которые возвращают функции. Значени по умолчанию, которое возвращается функцией — это значение undefined, которое следует понимать как «значение не определено». Если вы программируете на Ruby, то значение undefined — это практически эквивалент значения nil.
Для того, чтобы определить значение которое будетвозвращено из функции следует использовать выражение return, которому передаются все данные, которые следует вернуть. Пример:
function exampleFunction(a,b) { a + b } alert(exampleFunction(100, 5)); //undefined function exampleFunction(a,b){ return a + b; } alert(exampleFunction(100, 5));//105
Пояснения:
1. Если вам необходимо вернуть несколько значений из функции, то все эти значения следует передать в return в виде массива или хэша.
В следущей статье мы разберемся с функциями более подробно.
Лучшая благодарность автору — ваши комментарии!
мая 11, 2011 at 17:48 (#)
Может тогда сразу уже coffeescript? (-:
мая 11, 2011 at 18:37 (#)
Честно признаться не понимаю преимущества coffeescript в небольших проетах. Да и то, что в Rails 3.1 он включен по умолчанию, не значит, что он пойдет в массы. Если посмотреть, то он не так уж популярен.
По CoffeScript в случае крайней нужды можно будет написать несколько статей о том, чем он отличается от JavaScript и этого будет достаточно для его изучения. Лично я CoffeeScript воспринимаю чисто как синтаксический сахар для JavaScript, хотя я могу и ошибаться.
мая 11, 2011 at 20:44 (#)
Пожалуйста, убирай в рсс сообщения под кат ; ).
мая 11, 2011 at 21:15 (#)
Да Ruby вообще не особо популярен. И, кстати, является чисто синтаксическим сахаром для С/С#/Java/на-чем-он-там-еще-был-написан ;)
Популярность тут не при чем. Javascript — весьма…э…странный язык, хоть и прекрасный, и граблей в нем накидано в избытке. It makes life easier (tries to).
мая 12, 2011 at 08:16 (#)
Хорошая статья! Про coffeecript думаю не стоит писать статей, лучше иметь базовые знания по js:)
Потому как coffeescript действительно всего лишь синт.сахар.