Изучаем 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 в виде массива или хэша.

В следущей статье мы разберемся с функциями более подробно.

Лучшая благодарность автору — ваши комментарии!

Tags:

Responses

  1. says:

    мая 11, 2011 at 17:48 (#)

    Может тогда сразу уже coffeescript? (-:

  2. admin says:

    мая 11, 2011 at 18:37 (#)

    Честно признаться не понимаю преимущества coffeescript в небольших проетах. Да и то, что в Rails 3.1 он включен по умолчанию, не значит, что он пойдет в массы. Если посмотреть, то он не так уж популярен.

    По CoffeScript в случае крайней нужды можно будет написать несколько статей о том, чем он отличается от JavaScript и этого будет достаточно для его изучения. Лично я CoffeeScript воспринимаю чисто как синтаксический сахар для JavaScript, хотя я могу и ошибаться.

  3. says:

    мая 11, 2011 at 20:44 (#)

    Пожалуйста, убирай в рсс сообщения под кат ; ).

  4. Meredian says:

    мая 11, 2011 at 21:15 (#)

    Да Ruby вообще не особо популярен. И, кстати, является чисто синтаксическим сахаром для С/С#/Java/на-чем-он-там-еще-был-написан ;)

    Популярность тут не при чем. Javascript — весьма…э…странный язык, хоть и прекрасный, и граблей в нем накидано в избытке. It makes life easier (tries to).

  5. yerlankussainov says:

    мая 12, 2011 at 08:16 (#)

    Хорошая статья! Про coffeecript думаю не стоит писать статей, лучше иметь базовые знания по js:)
    Потому как coffeescript действительно всего лишь синт.сахар.

Leave a Response

Для подсветки кода используйте BB - коды: [language]...[/language], где language может быть: ruby, javascript, css, html.