Это очень удобно, поскольку взглянув на функцию — мы уже примерно представляем, что она делает, даже если функцию написал совсем другой человек, а в отдельных случаях — и какого вида значение она возвращает.
Одна функция — одно действие
Функция должна делать только то, что явно подразумевается её названием. И это должно быть одно действие.
Если оно сложное и подразумевает поддействия — может быть имеет смысл выделить их в отдельные функции? Зачастую это имеет смысл, чтобы лучше структурировать код.
…Но самое главное — в функции не должно быть ничего, кроме самого действия и поддействий, неразрывно связанных с ним.
Например, функция проверки данных (скажем, "validate") не должна показывать сообщение об ошибке. Её действие — проверить.
Сверхкороткие имена функций
Имена функций, которые используются очень часто, иногда делают сверхкороткими.
Например, во фреймворке jQuery есть функция $, во фреймворке Prototype — функция $$, а в библиотеке Underscore очень активно используется функция с названием из одного символа подчеркивания _.
Итого
Объявление функции:
function имя(параметры, через, запятую) {
код функции
}
Передаваемые значения копируются в параметры функции и становятся локальными переменными.
Параметры функции являются её локальными переменными.
Можно объявить новые локальные переменые при помощи var.
Значение возвращается оператором return ....
Вызов return тут же прекращает функцию.
Если return; вызван без значения, или функция завершилась без return, то её результат равен undefined.
При обращении к необъявленной переменной функция будет искать внешнюю переменную с таким именем.
По возможности, рекомендуется использовать локальные переменные и параметры:
Это делает очевидным общий поток выполнения — что передаётся в функцию и какой получаем результат.
Это предотвращает возможные конфликты доступа, когда две функции, возможно написанные в разное время или разными людьми, неожиданно используют одну и ту же внешнюю переменную.
Именование функций:
Имя функции должно понятно и чётко отражать, что она делает. Увидев её вызов в коде, вы должны тут же понимать, что она делает.
Функция — это действие, поэтому для имён функций, как правило, используются глаголы.
Функции являются основными строительными блоками скриптов. Мы будем неоднократно возвращаться к ним и изучать все более и более глубоко.
Важность: 1
Задача «Hello World» для функций
Напишите функцию min(a,b), которая возвращает меньшее из чисел a,b.
Пример вызовов:
min(2, 5) == 2
min(3, -1) == -1
min(1, 1) == 1
Решение
[Открыть задачу в новом окне]
Важность: 4
Напишите функцию pow(x,n), которая возвращает x в степени n. Иначе говоря, умножает x на себя n раз и возвращает результат.
pow(3, 2) = 3*3 = 9
pow(3, 3) = 3*3*3 = 27
pow(1, 100) = 1*1*...*1 = 1
Создайте страницу, которая запрашивает x и n, а затем выводит результат pow(x,n).
Демо: tutorial/intro/pow.html
P.S. В этой задаче функция обязана поддерживать только натуральные значения n, т.е. целые от 1 и выше.
Решение
[Открыть задачу в новом окне]
‹ Конструкция switch Рекурсия, стек ›
23.07.2011
Илья Кантор
Артём
Вот в этом месте вы опечатались: "Конечно, если бы в строке (1) была бы объявлена локальная переменная var userName = ..., то все обращения использовали бы её, и внешняя переменная осталась бы неизменной." Должно быть "...в строке (4)...".
Артём
Всё правильно у вас) Я ошибся.
Alexnebesky
в пункте "Параметры копируются в локальные переменные функции." забыли поменять from на title в принимаемых параметрах функции, в результате title undefined =)
Бойко Евгений
Не лишним будет в этой статье напомнить, что функция, как и массив, является объектом. function func() { // неважно что }
Есть методология изложения материала. Нельзя рассказать сразу и все. Для начинающих упоминание , что ф-ция является объектом ничего даст. Тогда как более продвинутые читатели знают об этом и так.
Дальнейшие уроки уже подготовив читателя , раскрывают понятие ф-ции как объекта.
Николай Евстратов
Подскажите, как можно запретить ввод букв в окно prompt? Или что бы место NaN выводилось сообщение "Вводить можно только цифры"?
David
Жалко в коде решения нет комментариев...
Илья Кантор
Gogy1985
return !!(Math.floor(num) == num);
ПавелСурж
В последней задече не предусмотрен случай если a и b равны! Я не посмотрев решения сразу написал тоже самое но с выводом равно если они равны.
Alexy
Хочу добавить одно замечание для людей, которые фанатически влюбляются в функции. Не создавайте функции для тех участков кода, которые будут использоваться 1-2 раза. Делает код не читабельным. Как то раз пришлось разбирать код человека, который на каждое действие клепал функции. Это ужасно! Функции надо создавать, если кусок кода будет использоваться 3+ раз! Аналогично с классами/объектами. Не забывайте про процедурный метод написания программ! Довольно часто он читабельнее
Liubov
В последнем примере нужно добавить проверку на то, что n целое, а не только больше-равно 1: if(!( n%1 == 0) || n <= 1){ alert('Степень ' + n + ' не поддерживается, введите целую степень, большую 1'); } else { alert( pow(x,n) ); }
Guest
В одном из примеров в функции проверяется значение if (!checkAge(age))... какую функцию выполняет воскл. знак перед вызовом функции checkAge?
Roman
! - логическое "не". !false == true, !true == false (подробнее читайте раздел "Логические операторы"). if ( !checkAge(age) ) - означает, что checkAge() должна возвратить false, чтобы даный if выполнился.
Гость
"Конечно, если бы в строке (1) была бы объявлена локальная переменная var userName = ..., то все обращения использовали бы её, и внешняя переменная осталась бы неизменной."
Лучше написать в строке 4 или как то переформулировать чтобы было понятно, что надо в комментарии надо искать ссылку (1).
Mel1
Да, лучше бы. Мне и в голову не пришло, что (1) искать в комментарии
All
у меня вопрос: внутри функции break для внешней метки не работает?
Tele-serg
http://learn.javascript.ru/pla...
Tele-serg
В линке что кинул више, если пользователь при вводе n нажмет отмена, то результат как-то не правильный. Что я сделал не так?
Hixer
Мои решения (прошу комментировать!): http://learn.javascript.ru/pla... http://learn.javascript.ru/pla... http://learn.javascript.ru/pla...
cath_kb
Последнее задание http://learn.javascript.ru/pla... Решение не отвечает требованию " В этой задаче функция обязана поддерживать только натуральные значения n, т.е. целые от 1 и выше. " Является ли верным данное решение: http://learn.javascript.ru/pla... ?
avts
Как много комментаторов в начале учебника... и как мало их в конце. Да, не всякая птица долетит до середины... Хи-хи... Желаю успехов))
Irena
"Не всякий заяц доскачет до середины леса. Но оглянись, тебе кажется, что ты углубляешься и достаточно уже углубился, а , глядь - и ты уже на другой его стороне."(цитата)
nik
объясните пж-та в чём разница м/у result=result*x и x=x*x Спасибо!
Влад
while(...) { x=3; result = x;
x=x*x; // 1-я итерация 3*3=9, 2-я 9*9=81 и т.д result=result*x; // 1-я итерация 3*3=9, 2-я 9*3=27 и т. д. }
Artem0431
function pow(x, n) { var g='n может быть только натуральным числом!'; if (n<1) return g else { var b=1; var i=0; while(i<n) b="b*x;" i++;="" return="" {="" }=""></n) >
Sananik163
Ребята, а зачем вам Вики? Здесь все итак предельно понятно.
Евгений
Если всё ясно без Вики, то что выведет alert?
var a = 42; function foo() { alert(typeof a); var a = 10; } foo();
o Мне нравится!
33kday
Шестипалый.. Короче ,я голову вчера целый день в Википедии ломал,но понял,что выражение в цикле x=x*x или result=result*x в цикле означает ,что оно циклически вызывает себя n раз
Reyuzaki2
я тут подумал,и решил,что циклы понимаю плохо,то есть сложные задания на цикл я сделать не смогу,надо читать Википедию
Karodar
Вопрос непосредственно к знающим: вот тут http://learn.javascript.ru/pla... можно пояснить некоторые моменты? Зачем нужна переменная 'i'
for(var i = 1; i < n; i++) { result *= x; }
·
mhz
Как я понял, переменная i выполняет роль счетчика, чтобы мы могли умножать х на саму себя до тех пор, пока i не станет равно n.
Dimitry Lapynow
Идея правильная. Но по условию i < n, цикл выполняется пока счетчик i меньше числа n. Таким образом количество итерация равно (число_степени - 1), это и есть то, сколько раз мы умножаем x на саму себя.
Reyuzaki2 Свернуть
Короче ,я голову вчера целый день в Википедии ломал,но понял,что выражение в цикле x=x*x или result=result*x в цикле означает ,что оно циклически вызывает себя n раз