Функции
В этой статье описаны функции 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 . Возможны неожиданные пересечения с другими переменными окна, конфликты и глюки.
В отличие от ряда языков, блоки не задают отдельную область видимости. Без разницы - определена переменная внутри блока или вне его. Так что эти два фрагмента совершенно эквивалентны:
Заданная через 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 .
При первом запуске функция работает с аргументами 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 , который содержит
- Аргументы вызова, начиная от нуля
- Длину в свойстве
length
- Ссылку на саму функцию в свойстве
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)
|
Just what I am searching for, coding, detailed and oriented.
Visit us at
West Palm Beach Towing Service
Thanks for your information, it was really very helpfull..
xnn airport codes 2020 pdf download
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
очень полезно
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
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
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
Thanks for this springfieldtowtruck.com
That is a good one towing service
That is a good one towing service
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
Nice post alexandriatowtruck.com/
Я очень ценю этот хороший контент Arlington Tow Truck
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
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
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
Find some fine local ladies in UK for hot chat all night long on our web platform Sex Encounters Yorkshire
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
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
google
Я рад видеть эту страницу Reston Tow Truck
This is a great content, excellent!
tow truck
Nice Informative Blog having nice sharing..
롤대리
Nice Informative Blog having nice sharing..
롤대리
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
Great Article it its really informative and innovative keep us posted with new updates. its was really valuable. thanks a lot.
epicor training courses
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
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
Your work is very good. Thank you for sharing great information to us. sex thüringen
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 먹튀검증
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!
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.
Roksa kępno
Thanks!
Affordable Fast Towing Service in Hialeah, FL
https://hialeahtowtruck.com/
Roksa wawer
Roksa poznań winogrady
Have fun learning the basics of coding!
Abingdon Tow Truck
Have fun learning the basics!
https://abingdontowtruck.com/
Good content! keep us posted.
Fredericksburg Towing Service
Good content! keep us posted.
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.
https://yasirelectronics.com/
https://yasirelectronics.com/product-category/dc-inverter-ac/
https://yasirelectronics.com/product-category/samsung-air-conditioners/
https://yasirelectronics.com/product-category/samsung-refrigerator
https://yasirelectronics.com/product-category/samsung-washing-machine/
https://yasirelectronics.com/product-category/samsung-microwave-oven/
https://yasirelectronics.com/product-category/hitachi-refrigerators/
https://yasirelectronics.com/product-category/water-dispenser/
https://yasirelectronics.com/product-category/fryer/
I'm studying JavaScript recently, and it really helped me a lot. 토토사이트
Thank you very much!
Transexuel Strasbourg is great platform for finding casual contact with fine ladies in France
that species may not be able to adapt to changing environmental conditions.카지노사이트
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 is the web place created for you to find casual contacts with young girls in Australia
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.
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.
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
Лучшее приложение для камеры Android здесь. Вы можете проверить здесь. B612 apk
I remember liking the majority of the wines, especially the whites from Becker. geometry dash
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!
The article was well-structured and easy to understand, offering valuable insights and practical information that made it both engaging and highly informative. -24kbet
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.