Javascript.RU

Функции

Update: Более новый материал по этой теме находится по адресу https://learn.javascript.ru/function-basics.

В этой статье описаны функции Javascript на уровне языка: создание, параметры, приемы работы, замыкания и многое другое.

Существует 3 способа создать функцию. Основное отличие в результате их работы - в том, что именованная функция видна везде, а анонимная - только после объявления:

Именованные (FunctionDeclaration) Анонимные (FunctionExpression)
function имя(параметры) {
...
}
var имя = function(параметры) {

}
...
var имя = new Function(параметры, '...')
Именованные функции доступны везде в области видимости Анонимные - доступны только с момента объявления. Синтаксис new Function используется редко, в основном для получения функции из текста, например, динамически загруженного с сервера в процессе выполнения скриптов.
/* функция sum 
определена ниже 
*/
var a = sum(2,2)

function sum(x,y) {
	return x+y
}
/* будет ошибка, 
т.к sum еще не существует
*/
var a = sum(2,2)

var sum = function(x,y) {
	return x+y
}

В javascript функции являются полноценными объектами встроенного класса Function. Именно поэтому их можно присваивать переменным, передавать и, конечно, у них есть свойства:

function f() {
	...
}
f.test = 6
...
alert(f.test) // 6

Свойства функции доступны и внутри функции, так что их можно использовать как статические переменные.

Например,

function func() {
	var funcObj = arguments.callee

	funcObj.test++
	alert(funcObj.test)
}
func.test = 1
func()
func()

В начале работы каждая функция создает внутри себя переменную arguments и присваивает arguments.callee ссылку на себя. Так что arguments.callee.test - свойство func.test, т.е статическая переменная test.

В примере нельзя было сделать присвоение:

var test = arguments.callee.test
test++

так как при этом операция ++ сработала бы на локальной переменной test, а не на свойстве test объекта функции.

Объект arguments также содержит все аргументы и может быть преобразован в массив (хотя им не является), об этом - ниже, в разделе про параметры.

Каждая функция, точнее даже каждый запуск функции задает свою индивидуальную область видимости.

Переменные можно объявлять в любом месте. Ключевое слово var задает переменную в текущей области видимости. Если его забыть, то переменная попадет в глобальный объект window. Возможны неожиданные пересечения с другими переменными окна, конфликты и глюки.

javascript function

В отличие от ряда языков, блоки не задают отдельную область видимости. Без разницы - определена переменная внутри блока или вне его. Так что эти два фрагмента совершенно эквивалентны:

javascript function

Заданная через var переменная видна везде в области видимости, даже до оператора var. Для примера сделаем функцию, которая будет менять переменную, var для которой находится ниже.

Например:

function a() {
	z = 5 // поменяет z локально.. 

	// .. т.к z объявлена через var
	var z
}

// тест
delete z // очистим на всякий случай глобальную z
a()

alert(window.z)  // => undefined, т.к z была изменена локально

Функции можно запускать с любым числом параметров.

Если функции передано меньше параметров, чем есть в определении, то отсутствующие считаются undefined.

Следующая функция возвращает время time, необходимое на преодоление дистанции distance с равномерной скоростью speed.

mwsnap016.jpg

При первом запуске функция работает с аргументами distance=10, speed=undefined. Обычно такая ситуация, если она поддерживается функцией, предусматривает значение по умолчанию:

// если speed - ложное значение(undefined, 0, false...) - подставить 10
speed = speed || 10

Оператор || в яваскрипт возвращает не true/false, а само значение (первое, которое приводится к true).

Поэтому его используют для задания значений по умолчанию. В нашем вызове speed будет вычислено как undefined || 10 = 10.

Поэтому результат будет 10/10 = 1.

Второй запуск - стандартный.

Третий запуск задает несколько дополнительных аргументов. В функции не предусмотрена работа с дополнительными аргументами, поэтому они просто игнорируются.

Ну и в последнем случае аргументов вообще нет, поэтому distance = undefined, и имеем результат деления undefined/10 = NaN (Not-A-Number, произошла ошибка).

Непосредственно перед входом в тело функции, автоматически создается объект arguments, который содержит

  1. Аргументы вызова, начиная от нуля
  2. Длину в свойстве length
  3. Ссылку на саму функцию в свойстве callee

Например,

function func() {
    for(var i=0;i<arguments.length;i++) {
        alert("arguments["+i+"] = "+arguments[i])
    }
}
func('a','b',true)

// выведет
// arguments[0] = a
// arguments[1] = b
// arguments[2] = true

Свойство arguments похоже на массив, т.к у него есть длина и числовые индексы. На самом деле arguments не принадлежит классу Array и не содержит его методов, таких как push, pop и других.

Если все же хочется воспользоваться этими методами, например, чтобы вызвать другую функцию с теми же аргументами, но кроме первого, можно создать из arguments настоящий массив:

var args = Array.prototype.slice.call(arguments)
// .. теперь args - настоящий массив аргументов ..
args.shift()
...

Вызвать функцию для массива аргументов можно при помощи apply:

var func = function(a,b) { alert(a+b) }
var arr = [1,2]
func.apply(null, arr)  // => alert(3)

Функцию легко можно передавать в качестве аргумента другой функции.

Например, map берет функцию func, применяет ее к каждому элементу массива arr и возвращает получившийся массив:

var map = function(func, arr) {
    var result = [ ]
    for(var i=0; i<arr.length; i++) {
        result[i] = func(arr[i])
    }
    return result
}

Пример использования:

map(run, [10, 20, 30])  // = [1,2,3]

Или можно создать анонимную функцию непосредственно в вызове map:

// анонимная функция утраивает числа
map( function (a) { return a*3 } ,  [1,2,3])  // = [3,6,9]

Бывают функции, аргументы которых сильно варьируются.

Например:

// можно указать только часть аргументов
// не указанные - вычисляются или берутся по умолчанию
function resize(toWidth, toHeight,  saveProportions, animate)  {
	// значения по умолчанию
	saveProportions = saveProportions || true
	animate = animate || true
	toHeight = toHeight || ...
}

Вызов с необязательными параметрами приходится делать так:

resize(100, null, null, true)

Чтобы избежать лишних null и сделать код более понятным, используют нечто вроде "keyword arguments", существующих в Python и Ruby. Для этого много параметров пакуют в единый объект:

function resize(setup)  {
	// значения по умолчанию
	var saveProportions = setup.saveProportions || true
	var animate = setup.animate || true
	var toHeight = setup.toHeight || ...
}

Вызов теперь делается гораздо проще:

var setup = {toWidth: 100, animate: true}

resize(setup)
// или
resize({toWidth: 100, animate: true})

Так - куда понятнее. А если параметров больше 5, то вообще - единственный нормальный способ.

Кроме того, с объектом можно удобнее делать последовательности вызовов вроде:

var setup = {toWidth: 100, animate: true, saveProportions: false}

resize(setup)

setup.toWidth = 200
resize(setup)

Автор: Alma West (не зарегистрирован), дата: 20 апреля, 2022 - 20:54
#permalink

Just what I am searching for, coding, detailed and oriented.
Visit us at
West Palm Beach Towing Service


Автор: farhan (не зарегистрирован), дата: 2 июня, 2021 - 09:23
#permalink

Thanks for your information, it was really very helpfull..
xnn airport codes 2020 pdf download


Автор: john bond (не зарегистрирован), дата: 2 июня, 2021 - 10:13
#permalink

I really enjoyed reading this post, big fan. Keep up the good work and please tell me when can you publish more articles or where can I read more on the subject?
luxy hijab


Автор: Jess (не зарегистрирован), дата: 2 июня, 2021 - 12:04
#permalink

очень полезно


Автор: john bond (не зарегистрирован), дата: 3 июня, 2021 - 14:38
#permalink

I really enjoyed reading this post, big fan. Keep up the good work and please tell me when can you publish more articles or where can I read more on the subject?
Fortune best cryptocurrency to invest in


Автор: Гостьsd (не зарегистрирован), дата: 5 июня, 2021 - 08:37
#permalink

Great content material and great layout. Your website deserves all of the positive feedback it’s been getting.
vận chuyển việt nhật


Автор: Dani567 (не зарегистрирован), дата: 10 июня, 2021 - 08:35
#permalink

I wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post.
Mudanças df


Автор: JADE (не зарегистрирован), дата: 11 июня, 2021 - 04:48
#permalink

Thanks for this springfieldtowtruck.com


Автор: Perry (не зарегистрирован), дата: 11 июня, 2021 - 05:53
#permalink

That is a good one towing service


Автор: Perry (не зарегистрирован), дата: 11 июня, 2021 - 05:59
#permalink

That is a good one towing service


Автор: farhan (не зарегистрирован), дата: 11 июня, 2021 - 15:31
#permalink

Thanks for your post. I’ve been thinking about writing a very comparable post over the last couple of weeks, I’ll probably keep it short and sweet and link to this instead if thats cool. Thanks.
ways to sell your home


Автор: LukeHMNGS (не зарегистрирован), дата: 14 июня, 2021 - 06:04
#permalink

Автор: Ashton (не зарегистрирован), дата: 15 июня, 2021 - 05:36
#permalink

Я очень ценю этот хороший контент Arlington Tow Truck


Автор: sd (не зарегистрирован), дата: 15 июня, 2021 - 12:17
#permalink

You have a real ability for writing unique content. I like how you think and the way you represent your views in this article. I agree with your way of thinking. Thank you for sharing.
Usvi boat charter


Автор: farhan (не зарегистрирован), дата: 15 июня, 2021 - 12:17
#permalink

You have a real ability for writing unique content. I like how you think and the way you represent your views in this article. I agree with your way of thinking. Thank you for sharing.
Usvi boat charter


Автор: john bond (не зарегистрирован), дата: 15 июня, 2021 - 20:44
#permalink

This article gives the light in which we can observe the reality. This is very nice one and gives indepth information. Thanks for this nice article.
Dr. Gőz Péter ügyvéd Debrecen


Автор: Sex Encounters Yorkshire (не зарегистрирован), дата: 16 июня, 2021 - 17:58
#permalink

Find some fine local ladies in UK for hot chat all night long on our web platform Sex Encounters Yorkshire


Автор: mikoas (не зарегистрирован), дата: 21 июня, 2021 - 08:02
#permalink

I just stumbled across your blog and wanted to say that I really enjoy reading your blog posts. By all means, I will subscribe to your feed and I hope you will post back soon. Many thanks for the useful information.
among us


Автор: minion889 (не зарегистрирован), дата: 21 июня, 2021 - 08:03
#permalink

I just stumbled across your blog and wanted to say that I really enjoy reading your blog posts. By all means, I will subscribe to your feed and I hope you will post back soon. Many thanks for the useful information.
among us


Автор: Maria shara (не зарегистрирован), дата: 27 июня, 2021 - 18:31
#permalink

Автор: Zion (не зарегистрирован), дата: 5 июля, 2021 - 05:18
#permalink

Я рад видеть эту страницу Reston Tow Truck


Автор: Edgewood (не зарегистрирован), дата: 2 августа, 2021 - 03:17
#permalink

This is a great content, excellent!
tow truck


Автор: Гостьsad (не зарегистрирован), дата: 29 августа, 2021 - 14:17
#permalink

Nice Informative Blog having nice sharing..
롤대리


Автор: farhan (не зарегистрирован), дата: 29 августа, 2021 - 14:18
#permalink

Nice Informative Blog having nice sharing..
롤대리


Автор: farhan (не зарегистрирован), дата: 6 сентября, 2021 - 18:13
#permalink

It is imperative that we read blog post very carefully. I am already done it and find that this post is really amazing.

arete capital


Автор: sd (не зарегистрирован), дата: 17 сентября, 2021 - 08:36
#permalink

Great Article it its really informative and innovative keep us posted with new updates. its was really valuable. thanks a lot.

epicor training courses


Автор: Гость (не зарегистрирован), дата: 25 сентября, 2021 - 10:52
#permalink

Hello, I have browsed most of your posts. This post is probably where I got the most useful information for my research. Thanks for posting, maybe we can see more on this. Are you aware of any other websites on this subject.
Mods pagos ETS2


Автор: Гость (не зарегистрирован), дата: 25 сентября, 2021 - 10:52
#permalink

Hello, I have browsed most of your posts. This post is probably where I got the most useful information for my research. Thanks for posting, maybe we can see more on this. Are you aware of any other websites on this subject.
Mods pagos ETS2


Автор: sex thüringen (не зарегистрирован), дата: 28 сентября, 2021 - 18:32
#permalink

Your work is very good. Thank you for sharing great information to us. sex thüringen


Автор: 먹튀검증 (не зарегистрирован), дата: 12 января, 2022 - 12:15
#permalink

I discovered your site ideal for me. It consists of wonderful and useful posts. I've read many of them and also got so much from them. In my experience, you do the truly amazing.Truly i'm impressed out of this publish 먹튀검증


Автор: david2022 (не зарегистрирован), дата: 2 апреля, 2022 - 16:22
#permalink

Thanks for sharing the information. This site is Very helpful, people can share there information here very easily. Buy RDP and Work Remotely from any where. We are providing Cheap RDP, dedicated server, VPS & hosting at the best price!


Автор: Judith Pantel (не зарегистрирован), дата: 11 апреля, 2022 - 20:38
#permalink

Sex Rheinland-Pfalz hat für Sie gesorgt. Es ist im Grunde die erste Anlaufstelle für alle, die in die Welt der Partnersuche einsteigen. Wenn Sie beim Online-Dating auf Nummer sicher gehen wollen, müssen Sie dort swipen, wo alle swipen.


Автор: Гость (не зарегистрирован), дата: 13 апреля, 2022 - 08:56
#permalink

Автор: Гость (не зарегистрирован), дата: 13 апреля, 2022 - 15:57
#permalink

Thanks!
Affordable Fast Towing Service in Hialeah, FL
https://hialeahtowtruck.com/


Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 02:58
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 14:01
#permalink

Автор: Abingdon Gae (не зарегистрирован), дата: 18 апреля, 2022 - 21:49
#permalink

Have fun learning the basics of coding!
Abingdon Tow Truck


Автор: Abingdon Gae (не зарегистрирован), дата: 18 апреля, 2022 - 21:51
#permalink

Have fun learning the basics!
https://abingdontowtruck.com/


Автор: Jacob Smith (не зарегистрирован), дата: 19 апреля, 2022 - 18:05
#permalink

Good content! keep us posted.

Fredericksburg Towing Service


Автор: Jacob Smith (не зарегистрирован), дата: 19 апреля, 2022 - 18:08
#permalink

Good content! keep us posted.


Автор: Kamma Christensen (не зарегистрирован), дата: 6 мая, 2022 - 20:37
#permalink

Sex annoncer Det er i princippet den første mulighed for alle, der begynder at gå på dating. Hvis du vil være på den sikre side i online dating, er du nødt til at kravle derhen, hvor alle andre kravler.


Автор: Yasir Electronics (не зарегистрирован), дата: 8 июня, 2022 - 19:37
#permalink

Автор: loka (не зарегистрирован), дата: 30 июня, 2022 - 03:10
#permalink

I'm studying JavaScript recently, and it really helped me a lot. 토토사이트


Автор: Гость (не зарегистрирован), дата: 11 октября, 2022 - 22:03
#permalink

Thank you very much!


Автор: Transexuel Strasbourg (не зарегистрирован), дата: 26 октября, 2022 - 07:51
#permalink

Transexuel Strasbourg is great platform for finding casual contact with fine ladies in France


Автор: 토토정보 (не зарегистрирован), дата: 31 октября, 2022 - 02:55
#permalink

that species may not be able to adapt to changing environmental conditions.카지노사이트


Автор: leochad (не зарегистрирован), дата: 19 декабря, 2022 - 11:30
#permalink

The article in this forum is very good, this article is very helpful for me. Nice to read your post. If you can, take a moment to play game trap the mouse one of the most exciting games


Автор: mature sex melbourne (не зарегистрирован), дата: 21 декабря, 2022 - 21:37
#permalink

mature sex melbourne is the web place created for you to find casual contacts with young girls in Australia


Автор: 카지노사이트 (не зарегистрирован), дата: 10 января, 2023 - 10:42
#permalink

My programmer is trying to convince me to move to .net from 카지노사이트. I have always disliked the idea because of the expenses. But he's tryiong none the less.


Автор: 카지노사이트 (не зарегистрирован), дата: 14 января, 2023 - 07:10
#permalink

Of course, your article is good enough, 카지노사이트 but I thought it would be much better to see professional photos and videos together. There are articles and photos on these topics on my homepage, so please visit and share your opinions.


Автор: Энн (не зарегистрирован), дата: 30 июня, 2023 - 09:39
#permalink

You need to get a number between "M" and "30", in this case it is "610.5". I don't quite understand how. Help plz. B612 apk


Автор: Энн (не зарегистрирован), дата: 30 июня, 2023 - 09:41
#permalink

Лучшее приложение для камеры Android здесь. Вы можете проверить здесь. B612 apk


Автор: betterwound (не зарегистрирован), дата: 3 августа, 2023 - 06:18
#permalink

I remember liking the majority of the wines, especially the whites from Becker. geometry dash


Автор: Lanes224 (не зарегистрирован), дата: 13 января, 2024 - 15:10
#permalink

Hold on to your seats because I'm about to spill the beans on this incredible site that's become my digital haven for sports gaming madness. We're talking soccer showdowns, basketball brawls, and tennis triumphs, all rolled into one epic experience. And the best part? You can enjoy all the action without budging from your gaming lair.

Major shoutouts to the masterminds who crafted this user-friendly marvel. Navigating through the site feels smoother than a well-timed pass, and the game variety is giving me the ultimate gaming buffet experience. I've been on a gaming spree, throwing challenges left and right and forging virtual alliances like a true sports hero.

If you're on the hunt for the ultimate sports gaming paradise, look no further. This site is the real deal. Tag your gaming crew, and let's embark on a virtual sports odyssey like never before!


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
6 + 4 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum