Функции на javascript: Функции — JavaScript | MDN
JavaScript Essential. Видео урок «Функции»
После просмотра этого видео урока Вы узнаете, что такое функция. Также в этом уроке Вы узнаете о особенностях использования функций в JavaScript и изучите такие конструкции как функции-литералы, функции обратного вызова. В этом уроке будут рассмотрены особенности языка связанные с областями видимости, поэтому для понимания принципов разработки сложных JavaScript модулей этот урок будет очень важным.
Функции – это блок кода, который можно многократно вызывать для выполнения. Функция может принимать аргументы и возвращать значения. Я думаю, что многие из слушателей этого видеокурса сталкивались с такими понятиями как функции и процедуры. На всякий случай давайте мы попробуем еще раз с самого начала объяснить и понять, как работают функции, какое их назначение в программном коде. Функция по сути является основным строительным блоком любого приложения. Если вы посмотрите на этот слайд, то вот этот прямоугольник посредине слайда, он у нас символизируем функцию, то есть это некий черный ящик. Мы даем ему какую-то информацию на вход, в этом черном ящике происходят какие-то операции и что-то появляется на выходе, какой-то результат. Вот получается, мы в функцию передаем сейчас, вот эта иконка символизирует у нас один байт информации, вот со значением один в двоичной системе исчисления. Вот мы в функцию передали это значение, вот эти колесики, они символизируют какие-то действия, происходящие внутри функции, то есть функция произвела какие-то вычисления, что-то произошло с этим значением, и в итоге функция на выход дала какое-то новое значение. Бывают функции, которые принимают данные и выдают какой-то результат. Бывают функции, которые ничего не принимают и выдают какой-то результат. Бывают функции, которые ничего не принимают и ничего не выдают. Бывают функции, которые что-то принимают, но ничего не возвращают. То есть, есть несколько разновидностей функций, мы сейчас их в коде всех с вами разберем. Но перед тем, как переходить к коду, давайте попробуем понять назначение функций на каком-нибудь простом, жизненном примере. Представьте, что вам, в вашем приложении нужно описать процесс заварки чая. Вам нужно будет в JavaScript сценарии несколько раз в разных частях программы вашей выполнять заварку чая. Из чего состоит заварка чая? Первое – нужно пойти на кухню. Второе – нужно взять чашку и засыпать туда сахар и чай. Третья операция – закипятить воду. Четвертая – залить воду в чашку. Вот 4 операции и чай готов. Если вам нужно в вашем приложении чай заваривать 10 раз, вот вам придется в 10 разных частях программы вызвать 4 инструкции для того, чтобы заварить чай. При этом вам нужно следить, чтобы вы не напутали с последовательностью инструкций, потому что если вы в начале зальете воду, потом закипятите ее, это уже будет не совсем чай, неправильно он будет сделан. Получается, что в тех ситуациях, когда у нас есть несколько инструкций, какой-то блок кода, который повторяется в разных частях программы, вот этот блок кода можно превратить в функцию. Например, вот эти 4 инструкции, для заварки чая, их можно вынести в функцию и дать функции имя «Заварить чай». А те части программы, в которых мы раньше пытались заваривать чай, используя 4 инструкции, 4 команды последовательные, вот эти 4 команды можно удалить и вместо них установить запуск функции «заварка чая». Я верю, что после просмотра примеров, назначение функций всем будет понятней.
Давайте сейчас посмотрим второй слайд, посмотрим, как именно функция определяется в JavaScript коде, потом перейдем в Visual Studio и посмотрим на несколько первых примерах. Когда мы хотим определить в коде функцию, первое, что мы должны сделать – это использовать специальное ключевое слово. Слова function. Наличие этого слова в коде указывает, что мы сейчас создаем новую функцию, или объявляем функцию. После слова function в большинстве случаев следует имя. В некоторых ситуациях имя не указывается, мы рассмотрим такие варианты функций, но сейчас на слайде вы видите, что сразу после function, тут же идет фраза, литерал, который будет указывать имя функции, обычно функцию называют не так, как на нашем слайде, myFunction – это имя, которое ничего не означает. По имени не можем понять, а что именно делает функция. Хорошее имя для функции – это глагол, описывающею что именно функция будет выполнять, когда мы ее вызовем. Например, функция будет называются getUserName. Сразу же понятно назначение функции. Если мы ее запустим, то она отдаст нам имя пользователя. Или спросит имя у пользователя, или спросит имя у пользователя, или получит его с каких-то внутренних переменных. Другой вариант функции – Calculate, CalculateSum, например, то есть посчитать сумму. Понятно, что если мы эту функцию запустим, то получим сумму каких-то значений. После имени функции, у нас установлены параметры, параметры – это то, что функция принимает для обработки. Если нашей функции при запуске необходимы какие-то значения, эти значения функции могут быть переданы с помощью параметров. Подробней с параметрами мы познакомимся с вами уже в примерах.
Давайте сейчас посмотрим первые примеры использования функции в Visual Studio. Значит, как мы уже посмотрели на слайдах, определение функции всегда начинается с ключевого слова function. Вот на строке 21 мы создаем функцию, создаем приложение, создаем строительный блок, который будем потом неоднократно использовать. Мы указали ключевое слово, далее мы указали имя функции – MyFirstFunction(). Так как эта функция не принимает никаких входящих данных, она не должна производить расчеты над какими-то значениями, мы просто после имени ставим круглые скобочки. Это означает, что функция не принимает никаких параметров. И далее в теле функции мы выполняем три инструкции, в тело документа выводим сообщение «Hello from MyFirstFunction!, How are you?, Goodbye!». Вот эти три строчки появляться в документе если мы запустим эту функцию. Мы сейчас просто создали функцию, то есть это просто заготовка, которую потом нужно вызвать, выполнить. Получается, когда интерпретатор, когда браузер дойдет до 21 строки. Существует такая функция, он не будет выполнять этот код, потому что определение функции, это просто создание инструкций, которые в будущем кто-то начнет использовать. Так же в нашем примере есть еще одна функция, на 27 строке, эта функция называется MySecondFunction(), и она выводит только одно сообщение «Hello from MySecondFunction!». Это все что она делает. Точно так же, как и предыдущая функция, это всего лишь объявление. То есть это блок кода, который не будет выполнятся до тех пор, пока мы не обратимся к функции и не запустим ее, не вызовем функцию. Значит 21-22 строка – мы объявили функцию. Теперь как мы этими функциями пользуемся. 33 строчка. Мы берем имя функции MyFirstFunction() уже без ключевого слова function, только имя и круглые скобочки. Когда мы используем такой синтаксис – имя функции + ее параметры, это означает, что мы обращаемся к функции и вот на строе 33, как только мы выполним эту операцию, это означает, что с 33 строки мы перепрыгиваем на строку 21. Выполняем инструкции на 22, 23, 24 строчке, и потом, когда мы эти инструкции до конца выполняем, мы возвращаемся обратно, перепрыгиваем на 33 строку и продолжаем выполнять инструкции, которые идут вот в этой части кода. Выполняем 35 строчку, вводим горизонтальную линию. Потом на 37 строчке мы видим, что мы взываем вторую функцию MySecondFunction(). То есть на 37 строке мы прыгаем на строчку 27, заходим в тело функции, вот операторные скобки, выполняем инструкцию, которая здесь заложена. Как только мы до конца выполняем все инструкции, заложенные в функции, мы возвращаемся обратно в ту точку, где функция изначально была запущена. Давайте попробуем проверить, что получится. Вот вы видите, первый раз мы на 33 строке вызвали функцию и отобразились те сообщения, которые заложены внутри этой функции, вот все эти инструкции, код весь этот выполнился. Потом 35 строчка, мы вывели горизонтальную линию. И строка 37 мы еще раз запустили функцию, уже вторую функцию и вот увидели ее результат. Если мы хотим несколько раз повторить вот этот блок кода, несколько раз вывести эти три сообщения, можем взять и просто продублировать вызов функции. Вот мы сейчас три раза запускаем MyFirstFunction(), то есть в приложении, на 33 строке мы пригнем на строку 21, выполним все что заложено в функции, вернемся обратно сюда. Перейдем на 34 строчку и увидим, что на ней опять происходит вызов функции. На 34 строке мы пригнем на 21 строчку, выполним все, что заложено в функцию и вернемся обратно на 34. На 35 опять пригнем в функцию, выполним все, что заложено и вернемся на 35. То есть каждый раз, когда мы вызываем функцию, мы производим переход в другую часть программы, выполняем инструкции, заложенные в этой другой части программы и возвращаемся обратно, где функция была изначально запущена. Давайте сейчас запустим и проверим, первый раз вызвалась наша функция, второй раз и третий раз. Вот пример, который я приводил с заваркой чая. Вместо того, чтобы здесь дублировать инструкции заварки чая, мы эти инструкции вынесли в отдельную функцию и каждый раз, когда нам хочется чая, мы берем и запускаем функцию сделать чай и не задумываемся о тех шагах, которые нужно выполнить, для того, чтобы появилась чашка чая. Перед тем, как переходить к следующим примерам, хочу, чтобы мы еще посмотрели, как можно пользоваться отладчиком и посмотреть, как функции работают именно под отладчиком. Лично мне удобней пользоваться отладчиком, который работает в Google Chrome, но как мы уже разбирали на прошлых уроках, если вы возьмете Firefox, например, с установленными Fireback флаером, или Internet Explorer, или Opera, во всех современных браузерах есть инструменты разработчика, поэтому просто выберете тот браузер, которым вам пользоваться нравится больше всего и в нем попробуйте разобраться с инструментами разработчика. Если мы сейчас запустим этот пример, в Chrome, если мы нажимаем на F12 в браузере это открывает панель разработчика. Вот панель разработчика, нас интересует сейчас вкладочка source. Вот когда вы впервые запустите свое приложение, вы увидите, что вот на этой вкладочке ничего нету, будет пусто, никаких исходных кодов текущего документа отображаться не будет. Если нажать по этой кнопочки showNavigator, то вы увидите те сценарии, которые доступны сейчас в текущем документе. Мы выбираем сейчас сам HTML документ, переходим в его исходный код, находим интересующею для нас функцию, вот мы хотим начать отладку с 33 строки. Ставим здесь breakpoint. Мы на прошлых занятиях разбирали с вами что такое breakpoint. Поставили breakpoint. Для того, чтобы теперь этот breakpoint сработал, чтобы эта точка остановила код и показала нам пошаговое выполнение скрипта, мы можем сейчас обновить страницу, видите сейчас вот это синий блок, красная стрелочка, которая находится рядом с ним, эта стрелочка символизирует ту часть кода, которую сейчас браузер выполняет. Вот сейчас мы возьмем с вами и если будем нажимать на кнопку F10 или на эту иконку, это означает, что мы переходи пошагово, построчно. Просто выполняем все инструкции. Если мы будем нажимать на кнопку F11 или на эту иконку, это будет означать, что при вызове функции мы будем переходить внутрь функции и смотреть, что будет происходить в самой функции. Вот если мы сейчас нажмем на F11, так как вот здесь мы взываем функцию myFunction, мы должны перейти внутрь функции, выполнить весь код, который находится в функции и вернутся обратно на 33 строчку. Давайте попробуем. Нажимаем на F11, видите мы попали внутрь функции, на строчку 22. Нажимаем еще раз F11, еще раз, и вот когда мы закончим операцию на 24 строке, мы вернемся в ту часть кода, в которой функцию изначально вызвали. Нажимаем еще раз F11 и вот видите мы вернулись на строчку 34 из-за функции, которую изначально запустили. Если сейчас еще раз нажать F11. Так как на 34 строке опять запускается функция, мы вернемся в тело функции и выполним то что находится в теле функции. Нажимаем F11, попадаем в функцию, выполняем код, который заложен в функции, видите, код у нас выводится сразу же в самом документе по мере его выполнения, выполнили функцию, вернулись в ту часть кода, где функция запускалась. Следующая функция, нажимаем F11, попадаем в тело функции, и вот так далее. Вот если вы не понимаете, как работает сценарий, если вы хотите найти ошибки в сценарии, рекомендую пользоваться отладчиком, он всегда помогает сэкономить время и быстро найти ту часть кода, с которой что-то у вас работает некорректно.
В следующем примере мы увидим, как в функции можно использовать переменные, которые доступны в области видимости, глобальной области видимости. Подробней о областях видимости мы сейчас с вами поговорим, а вот пока разберем данный пример. То есть в этом примере мы разберем, что функции могут работать с переменными в своем теле. Сейчас у нас есть 2 функции, на 22 строчке ask и на 28 функция say. То есть «спросить» и «сказать». Функция ask будет запускать ряд prompt функций, то есть функция prompt, это функция, которая уже определена в браузере. То есть если вот эта функция, это основная функция, то функция prompt находится где-то в браузере, задача этой функции показать диалоговое окошко, получить от пользователя данные, обработать эти данные и вернуть в наше приложение, вернуть нашему сценарию уже. Если кто-то запустит функцию ask в нашем коде, то вначале мы получим от пользователя имя, потом фамилию, потом возраст. И эти полученные данные запишем в переменную name, sname и age. Переменные, которые мы используем в функции ask обвялены выше, на 18, 19, 20 строчке. Вот эти переменные объявлены здесь и соответственно они могут быть использованы как внутри функции ask, так и внутри функции say. Видите, что функция say будет последовательно отображать вначале имя, потом фамилию, потом возраст и выводить эту информацию в тело документа. Но как мы уже с вами обсуждали, определение функции не значит, что эти функции будут работать, просто определив функцию, мы определили строительный блок в нашем приложении. Тут этот строительный блок должен использовать, для того чтобы код в функции запустился. И вот на 37 строке мы первый раз вначале запускаем функцию ask, чтобы попросить пользователя заполнить значениями переменные. А второй раз на 38 строчке мы запускаем функцию say, чтобы значения, которые находятся в переменных отобразились пользователю на экран. Давайте запустим пример и проверим. Первое – введите свое имя, фамилию и возраст. Вот значения, которые мы ввели в поля ввода, вот они отобразились у нас на экране.
В следующем третьем примере мы по сути разбираем второй пример, который переделан на использование в цикле. То есть мы здесь будем неоднократно задавать пользователю вопрос, для того, чтобы как бы повторно выполнить несколько операций, несколько функций. Вначале сценария определяются те же функции, что и в предыдущем примере, но вот на 34 строке запускается цикл do..while, помните, что в цикле do..while у нас всегда выполняются первая итерация, а потом, в зависимости от условия мы либо продолжаем работать, либо повторяем итерацию цикла, либо выходим из цикла и продолжаем инструкции. Каждый раз, когда будет запускается цикл do..while, на каждой итерации мы будем запрашивать имя, фамилию, возраст. Отображать полученные данные, а потом на 38 строчке в переменную repeat записывать значения, которые пользователь выберет в диалоговом окошке с кнопками «Да» и «Нет». То есть мы спросим «Пройти заполнение еще раз?». Если пользователь нажмет на «Да», то в переменную repeat запишется значение true и мы на строке 38, условие у нас срабатывает, поэтому мы возвращаемся на начало и еще раз выполняем инструкцию. Если же пользователь выберет значение «Нет» — cancel нажмет, то repeat будет false, условие не срабатывает и наш сценарий выходит дальше, ну дальше нет инструкции, поэтому выполнение кода завершается. Давайте проверим. Вот «Введите свое имя, фамилию, возраст» и теперь смотрите, мы первый раз вывели, запустили первую-вторую функцию, ask и say. Теперь запускается функция confirm, которая спрашивает повторить или нет, если мы нажмем повторить, мы еще раз запускаем повторную функцию ask, она у нас спрашивает возраст и фамилию, потом нажимаем на Ок. Теперь, если мы нажмем на cancel, то у нас спрашивает повторно хотим ли мы заполнить эту анкету, если мы нажимаем на cancel, то цикл прекращается, повторно функцию мы уже не запускаем и прекращаем генерировать какой-то контент, в текущем документе. Вот получается, что использование функции, они даже упрощают понимание самого кода, нам не приходится вдавятся в детали, в подробности, мы можем просто запомнить, что делает каждая из этих функций и просто проанализировать алгоритм работы самого сценария. Вот у нас есть задание вопросов, потом что-то мы выводим пользователю, потом спрашиваем нужно ли повторить и выполняем повторение, если пользователь согласится с повтором. Но если бы у нас функции не было, то все, что находится внутри, детали реализации задания вопросов, детали реализации вывода результатов в документ, все эти детали находились в самом цикле do, и соответственно цикл был бы достаточно большим, достаточно сложно было бы его редактировать и контролировать, а так, когда у вас есть отдельные функции и у функции выражены четко обязанности функции, то вы может, если вы знаете, что нашли ошибку, в той части кода, в котором задают вопрос, то сразу понимаете куда нужно обратится, где нужно искать ошибку. Нужно открыть функцию ask и посмотреть, как она работает. Если вы зафиксировали ошибку в выводе пользователю данных, вы берете функцию say и проверяете, что в этой функции было написано неправильно. Если же у вас функции нету и все выполняется единым блоком кода, там несколько сотен строчек, то в таком случае вам нужно будет ковыряться вот в всем этом коде и искать где там что происходит. Поэтому функции, они очень часто помогаю сделать код более логическим, структурированным, сделать так, чтобы его потом проще сохранить. Если вам нужно пользоваться функциями, то сценарий становится упорядоченным и дальше с ним будет намного легче работать. В следующих примерах мы посмотрим, как можно задавать функциям аргументы. Как можно сделать функцию, которая при запуске будет получать от пользователя какие-либо данные. Как мы уже говорили, параметры функции определяются после имени функции, вот на 22 строке функция, как и в предыдущих наших примерах не принимает никаких параметров или аргументов. Аргументы и параметры – это одно и тоже самое. Вот на 20 строчке функция не принимает аргументов, а на строке 25 функция принимает 2 аргумента или 2 параметра. Первый параметр с именем х1, второй параметр с именем х2. Давайте пока разберем первую функцию, что она делает. В функции самм1 на строке 21 создается переменная result и в эту переменную записывается сумма двух других переменных, которые определены выше, на строке 15 и 16. Получается, что в переменную result будет записана сумма 25. И эту сумму на 22 строке мы отобразим в тело документа. На строке 26, когда мы разбираем эту функцию, мы не можем заранее знать какой результат будет отображается этой функцией, потому что при загрузке функции — вот эти переменные х1 и х2, в эти параметры могут быть заданы какие-либо значение. Какие именно мы сейчас не знаем, потому что выше таких переменных х1 и х2 у нас не объявлено. Получается, что кто-то запуская эту функцию передаст сюда значение. Например, в х1 передаст значение 1, в х2 значение – 4, например. Вот здесь на 26 строчке 1 + 4 даст результат 5. Этот результат будет записан в переменную result и в итоге отображен на 27 строке. Вот мы увидели 2 объявление функции. Давайте теперь разберем как эта функция запускается. Разницу вызова. На строке 33 мы берем sum1 и {} после sum2. Этот вызов правильный, потому что сама функция ничего не принимает, не требует никаких от пользователя значений. Под пользователем сейчас подразумевается разработчик, который запускает эту функцию. И вот сейчас на 33 строке у нас запускается функция и на экране мы выводим результат, результат 25. На строке 25 мы запускаем функцию sum2. И тоже не переедаем ей никаких параметров, это у нас не правильно потому что функция sum1 при определении требует два аргумента х1 и х2. Если мы не будем при вызове передавать никаких значений, то это будет означать, что х1 и х2 будут неопределенны. А мы уже с вами знаем, что когда будет, когда создаем переменную и не указываем значение для этой переменной. У переменной значением по умолчанию будет undefined. Давайте посмотрим, что получится если запустить такую функцию. Видите, первый раз мы увидели 25, когда вызвали sum1, а второй раз, когда мы вызвали саааамммммм2, мы результат увидели, как none. Потому что undefined + undefined получается непонятно что, not a number. Вот мы выводим этот результата. Вот когда на 36 строке мы запускаем функцию sum2, мы уже пользуемся ею корректно, мы передаем ей два значение, мы указываем, что первое значение будет значение переменной “c”. Переменная “c” у нас находится на 17 строке, в ней находится значение 20. Нас троке 36 у нас находится значение переменной “d”. Это значение придется как второй аргумент. В переменной “d” находится значение 21. Сейчас, на 36 строке, когда запускается эта функция, мы переходим на 25 строчку, здесь в х1 находится значение 20, в х2 находится значение 21. Соответственно сумма 21 и 20 дает результат 41, который мы выводим на экран. Видите, 41 отобразилось у нас в документе. При запуске функции необязательно передавать значения, которые взяты из переменных, мы можем прямо здесь установить значение 2 и 10, например. Вот сейчас, если мы запустим вот такую функцию, то результат, который выведется в документ, будет равен 12. Проверяем. Получилось 12. Давайте еще раз посмотрим, как это будет выглядеть в отладчике. Нажимаем F12, берем source, navigator, выбираем текущий документ, переходим к той части кода, которая нас интересует, вот нас интересует сейчас 36 строка. Ставим здесь breakpoint, нажимаем refresh, вот мы остановились на этой функции, остановили ее, давайте нажмем сейчас step_into, или F11, мы перепрыгнули функцию, если сейчас мы наведем мишкой на х1, Chrome подскажет, что в этой переменной значение 2, в х2 – значение 10. В соответствии с теми значениями, которые мы передавали при вызове. Эти значения попали в эти два параметра, или в эти два аргумента и теперь на 26 строке мы эти значения сложили, можем сейчас нажать stepinto или stepover, сейчас без разницы, потому что эта строчка не является вызовом функции. Давайте нажмем на F10, и переходим на следующею строку. Если наводим на result, видим, что Chrome подсказывает, что значение переменной 12. Значение мы дальше отображаем в тело документа. Его выведем сейчас. Вот 12 у нас отобразилось. Не забывайте пользоваться отладчиком, когда вы чего-то не понимаете, старайтесь с помощью отладчика выяснить что происходит внутри сценария.
В следующем пример мы посмотрим, как можно сделать так, чтобы функция требовала, чтобы одни параметры обязательно к ней были заданы, а другие параметры были опциональны. Вот сейчас на 15 строчке мы хотим сделать так, чтобы функция print принимала два аргумента. Первый аргумент- был обязательно, а второй аргумент, если его не предоставят, то функция возьмет свое какое-то значение по умолчанию. Задача функции print отображать в документе несколько сообщений, сообщений, которые были переданы первому аргументу. Вот если кто-то запускает эту функцию, первое, что делает функция – это 17 строчка. Проверят было ли предоставлено значение в параметр count. Если count равен undefined, то строка 18 мы говорим, что count будет равен значению три. То есть по умолчанию у нас всегда функция принт будет с count равен трем. Но если при запуске сюда передать значение, то на 17 строке условие не срабатывает и count будет равен тому значению, которое передал пользователь при вызове. Дальше после проверки на 21 строке мы запускаем цикл фор на количество итераций, равной значению переменной count. То есть count раз, на 22 строчке мы выводим сообщение переменной msg, то есть message. А в конце, когда все это заканчивается на 25 строке мы выводим horizontalRool. Вызов функции на 31 строчке, мы вызываем функцию только с один значение, со значением Hello, это значение первое, соответственно оно адресовано первому аргументу, переменной msg. НА 31 строке мы увидим, что сообщение Hello отобразится три раза, потому что count по умолчанию будет равен трем. На 32 строке, когда мы вызываем print двумя параметрами, двумя значениями world и семь. Это означает, что msg будет world, count будет равен семи. Соответственно условие не срабатывает и цикл срабатывает семь раз со значением, которое ввел пользователь. Hello три раза в соответствии со значением по умолчанию, world – семь раз. Вот этот пример показывает, как можно создать функцию и определить в функции опциональные параметры, которые не обязательны при запуске. Очень часто разработчики, которые создаю функцию с функциональными параметрами, добавляют вот такой комментарий, просто пишут необязательный параметр, или опциональный параметр для того, чтобы было понятно, что эта переменная, этот аргумент, он не обязательный при вызове. Все функции, которые мы сейчас с вами посмотрели, по сути они были процедурами, вот если вы работали с другими языками программирования, то вы сталкивались с таким термином как функция и процедура. Функция – это конструкция, блок кода, который мы запускаем, блок кода что-то делает, а потом возвращает нам результат. А процедура – это такой же блок кода, который мы запускаем, что-то происходит в этом блоке кода, но в результате ничего нам как клиентам этого блока кода, как запускающей стороне, нам никакой результат е возвращается. Вот мы с вами видели, что все наши примеры, в этих примерах функции не возвращали никаких данных в ответ. Мы их запустили, а в ответ ничего не получили. На самом деле в JavaScript нет такого понятия как процедуры, потому что любая функция всегда возвращает нам значение. Вот сейчас, у нас у всех примерах любая функция всегда возвращала значение undefined, просто мы им не пользовались и его игнорировали. Но запомните, что любая функция, если она не возвращает явно никаких данных, она вернет значение undefined. Давайте сейчас поострим как можно сделать функции, которые будут возвращать то что они рассчитали, то что они выполнили по окончанию своей работы.
Вот в следующем №6 примере мы посмотрим, как используется ключевое слово return и что оно делает. На строке 16 мы объявляем функцию sum, которая будет суммировать два входящих параметра «а» и «б». Но мы хотим сделать так, что функция, получив значение и посчитав сумму, не выводила сразу же результат в тело документа, а возвращала результат, которой получила. Мало ил как мы захотим с этим результатом работать, может мы не хотим его отображать в документе, может мы alert вывести, или мало что можно еще делать. Для того, чтобы функция просто вернула результаты своей работы, на 17 строке мы используем ключевое слово return, и после этого слова указываем то значение, которое функция должна будет вернуть после своей работы. Если запустить функцию sum, она у нас выполнит вычисления, отдаст результат своих исчислений, отдаст сумму двух входящих параметров. Вот когда мы пользуемся такими функциями, строка 20, нам необходимо использовать функции вот в таком ключе, таким синтаксисом. Мы создаем переменную, а потом эту переменную инициализируем результатом работы функции. Если мы запускаем любую функцию, которая есть в JavaScript коде, эта функция всегда что-то возвращает, и это возвращаемое значение мы можем присвоить переменной. Вот сейчас возвращаемое значение функции sum будет суммой двух аргументов, два и три. Поэтому в переменную рез запишется результат 5, результат на 22 строке мы отобразим. Давайте проверим. Вот отобразилось значение 5. Если мы сейчас возьмем и, например, поменяем 18 строчку, наберем ключевое слово return, функция у нас уже будет выполнять возврат значений. Теперь это значение будет undefined, потому что это значение по умолчанию. Если разработчик не указал, что функция возвращает, то функция всегда будет возвращать undefined. Давайте запустим. Видите, результат работы функции undefined. Поэтому если вы не написали return, или ключевое слово return просто не выполнилось в теле функции, это означает, что функция вернет значение undefined. И еще, то что вы должны понимать, ключевое слово return прекращает выполнение функции. Если после этого ключевого слова мы напишем сообщение, это сообщение у нас не выведется, потому что 17 строка, как только интерпретатор видит ключевое слово return и выполняет его, то вот на этом ключевом слове у нас и заканчивается работа функции. Мы из 17 строки перепрыгиваем в ту точку кода, где функция изначально запускалась, тот результат, который ключевым словом return был возвращен, мы записываем в переменную. Вот вернулась 5, а alert так и не отобразился.
Вот теперь небольшой такой пример с использованием нескольких функций, которые возвращают результат. Сейчас мы определили 4 функции, функция add, для сложения, функция sub, для получения разницы, mul – для умножения и div – для деления. В каждой функции мы выполняем арифметическую операцию и результат возвращаем с помощью ключевого слова return. После определения функций, на строке 32 от пользователя с помощью prompt мы получаем введите первое число, то есть первую цифру, операнд один, потом мы получаем знак операции, + — * / строка 34. Потом получаем операнд два, второе значение. И 35 строчка – создаем переменную, которая будет просто содержать в себе результат работы наших дальнейших вычислений. На 37-38 строке мы используя функцию parseInt, конвертируем значение, которое вводил пользователь в целочисленное, для того, чтобы все арифметические действия выполнялись как операции над числами, а не операции над строками. На 40 строчки создаем switch, для того, чтобы проверить какое значение было введено с помощью prompt на 33 строке. Если пользователь выбрал +, то 42 строчка в переменную result мы записываем значение, которое возвращает функция add, мы вызываем функцию, определенную выше, передаем в эту функцию два параметра, которые были получены от пользователя на 37-38 строке. И результат, который получится — записываем в переменную result, на 43 строчке у нас выполняется break, поэтому после этой строки мы выпрыгиваем за switch и отображаем надпись од 7 строки. Если у нас результат не undefined, потому что, мало ли мы не попали ни в один из case, если мы вот с брейка перепрыгнем сюда, то вот тогда мы отобразим, что вот такой операнд + символ + второй операнд = значение. Если мы сейчас выберем, например, нажмем не на +, вот здесь в переменную sun поместим не +, а допустим значение «*» — умножить, то тогда на 40 строчке, когда будет работать switch, мы перепрыгнем на строку 48, на 48 строчку, выполним этот блок кода. Выполнится уже другая функция, которая получит 2 параметра и получит произведение 2 значений, это значение здесь запишется в result и здесь запишется. Давайте проверим как будет работать этот код. Введите первое число. Вводим два. Введите знак арифметической операции – вводим «+» и второе число – тоже два. Вот результат «2+2=4». Вводим 5*12, получается – 60. Вот такой простенький калькулятор написанный на JavaScript.
В следующем примере мы разберем пример с использованием нескольких аргументов. Если копнуть немножко глубже, то на самом деле функция в языке JavaScript – это не просто как бы синтаксическая единица, это тип данных. Если вы работали с языками там С++, Pascal, C#, любыми языками программирования, в большинстве языков функция это именно вот синтаксическая конструкция, это часть языка, с помощью которой мы определяем блок кода для повторного использования. А вот в JavaScript – функция – это тип данных и любая функция – это на самом деле – объект. Вот сейчас пока вы можете рассматривать функции как код для повторения, но если вы будут дальше работать с JavaScript кодом, если вы будут прослушивать следующий курс JavaScript углубленный, то вы там будете очень часто сталкивается вот с тем, что функция – это объект, а не просто кусочек кода. И вот сейчас мы тоже с вами увидим вот эту особенность функции в JavaScript коде, увидим, что функции, как объекты содержат в себе какие-то свойства. То есть функция кроме кода, который нужно выполнить, также в себе содержит разные значение, которые могут помочь создавать сложные и интересные сценарии. Сейчас у нас на 16 строке есть функции max, задача этой функции показать нам максимально значение того аргумента, который был передан при вызове. Вот если мы запустим функцию max и передадим в «а» значение 1, в «и» значение 10, а в «с» значение – 100, то функция вернет то значение, которое максимальное. Значение параметра «с», потому что там была записана сотня. Но также мы хоти сделать так, чтобы функция принимала у нас не только три параметра, а допустим 5, 10, 20, то есть неограниченное количество параметров. И в JavaScript это сделать очень легко, мы можем сделать так, чтобы функция принимала хоть 50 параметров, нам в принципе все равно. На 18 строке, когда эту функцию запустят, мы создадим переменную maxValue, вот в этой переменной будет находится максимальное значение, которое мы найдем в параметрах. Но изначально максимальным значением мы считаем минимальное значение, которое вообще может быть записано в целочисленную переменную. Мы записываем минус бесконечность. И потом посредством цикла, посредством проверок, мы это значение будем менять. На строке 19 вот мы изначально выводим какое значение записано в переменную maxValue, изначально мы записали NegativInfinity, то есть минус бесконечность. После вывода этого сообщение, на строке 21 запускается цикл и обратите внимание, на какое количество итераций. Мы берем переменную arguments и берем ее свойства length. Откуда взялась переменная arguments, если посмотреть вот в текущем коде, нигде такую переменную мы с вами не определяли. Вот как раз эта переменная, она у нас доступна сейчас в данном блоке кода, потому что функция – это не просто кусочек кода, это не синтаксическая единица языка JavaScript – это объект. Вот когда мы, вот сейчас выделенный код, который вы видите у себя, это есть код, который находится внутри объекта с именем макс внутри функции. И вот у объектов функции есть несколько свойств. Одно из свойств – это свойство arguments, которое в себе содержит все аргументы передаваемые функции при запуске. Вот сейчас, если мы запусти эту функцию вот таким вот способом, на строке 28 видите мы передаем 1, 2, 3, 4, 5. Пять значений. И вот получается сейчас, когда эта функция начинает работать, в переменной «а», «b», «с» находится -33, 33, 777. А вот остальные значения, они у нас не представлены параметрами, но они все равно доступны в функции, они как бы доступны функции через массив arguments. Массив arguments – это все значение, которые пришли в функцию при вызове. Вот сейчас в этом массиве, кроме первых трех значений, которые доступны так же через параметры, находится еще и два дополнительных значения, -666 и -22. Вот сейчас мы запускаем цикл на 21 строке, и на каждой итерации проверяем. Если arguments, вот как раз предыдущий урок, мы смотрели массивы, если и-тый элемент массива, на первой итерации – это -33. Если он больше, чем maxValue, а 33 будет больше чем минус бесконечность в любом случае, то есть если больше, то тогда 23 строчка, максимальное значение – оно у нас будет равно текущему аргументу – из массива arguments. То есть в maxValue мы записываем -33. Потом следующая итерация, мы берем следующий элемент из массива arguments 33, 33 больше чем maxValue? maxValue сейчас у нас -33, соответственно положительное 33 больше чем -33. maxValue теперь у нас новое значение, значение 33. Следующая итерация, здесь у нас 777, здесь 33. 777 больше чем 33, поэтому maxValue теперь у нас 777. Следующая итерация, здесь у нас находится -666, а maxValue у нас три семерки. Три семерки больше, условие не срабатывает, в условие мы не попадаем и maxValue не изменяем. То есть в итоге в переменной maxValue останется максимальное значение, которое при запуске было передано в параметры. Вот это максимально значение, которое по завершению этого цикла мы получим, это значение на 25 строке мы вернем с помощью ключевого слова return. И на 28 строчке видит, в переменную rez мы записываем тот результат, который был возвращен в функцию. Ну на 33 строке мы этот результат показываем в документ. В нашем случае, максимально значение сейчас будет 777. Вот это значение у нас вывелось. Если мы добавим еще несколько параметров, вот сейчас максимальное значение будет у нас 1000, это максимальное значение на 30 строке отобразится. Вот отобразилась 1000. В этом примере, что показывает этот пример, то что вам нужно запомнить, создавая функцию, вы можете сделать так, чтобы функция принимала неограниченное количество параметров, и вы в функции могли получать доступ ко всем этим параметров. Для этого вам необходимо пользоваться свойством arguments, которое доступно в теле функции. За пределами функции, это свойство у вас будет недоступным. Но когда вы работаете в этой функции, посредством этого свойства вы можете получать доступ ко всем параметрам, которые были переданы в функцию при запуске.
И последний, девятый пример из первой директории, показывает, как мы можем сделать функцию, которая будет проверять правильное ли количество параметров передали функции при запуске. Иногда нам важно, чтобы запускаемая функция принимала столько аргументов, сколько было указано при определении функции. Вот в предыдущем примере мы специально сделали так, чтобы функция принимала неограниченное количество параметров. Но сейчас мы хотим сделать именно так, чтобы в функции у нас принималось ровно три параметра, ни меньше, ни больше. Если количество параметров не совпадает с требованными, то наша функция вообще никаких операций не будет производить. Определяем функцию мы на 16 строке. Видите, что функция принимает скорей всего три координаты: х, у, z. На 19 строчке у нас идет проверка. Если arguments.lenght не равно 3, то выводим сообщение о ошибке. И больше по сути ничего не делаем, ведь этот блок кода у нас не срабатывает. Если же arguments равно 3, то условие на 19 строке не сработает, сработает блок else, увидим сообщение, что у нас корректно были получены данные и строка 25, запустив цикл for, все значения, который были получены в параметрах мы отобразим на экран через запятую. Вот посмотрите теперь на то как мы функцией пользуемся. На 30 строке мы запускаем функцию с именем f, то есть вот эту функцию и передаем 4 значения при запуске. Четыре значение — это перебор, наша функцию требует три значения, это условие на 19 строке срабатывает и выводит ошибку. А вот на строке 31, когда мы передаем три значения, функцию получив эти три значения не запускает if, попадает в блок else и соответственно срабатывает у нас как бы сама логика функции. Ну и 32 строчка, тоже функцию не срабатывает, так как количество параметров у нас меньше трех. Первый раз – ошибка. Четыре аргумента было получено, второй раз все нормально, вывелись все элементы, третий раз опять ошибка – у нас меньше аргументов чем надо, было получено два аргумента. Вот в первой части урока мы рассмотрели с вами как создаются функции, как сделать так, чтобы функция возвращала результат своей работы, как сделать так, чтобы функция принимала входные параметры и как можно сделать функцию, которая работает с неограниченным количеством параметров, для этого в функции есть свойство arguments. Эти примеры обязательно хорошо рассмотрите, изучите, потому что это основа работы с функциями.
Вторая часть урока будет посвящена областям видимости. Перед тем, как перейти к областям видимости мы повторим с вами что происходит с переменными, которые не создавали. Нам пригодится дальше для того, чтобы понимать следующий пример. На 13 строке мы создаем переменную «а». Помните, что если переменной мы не присваиваем значение, то значение этой переменной при чтении будет у нас undefined. Для остальных переменных мы задаем конкретное значение и соответственно переменные у нас инициализируются и получают какой-то определений тип данных. Переменная «b» со значением 777 она у нас будет number. На строке 15 переменная «c» использует значение переменной «b», соответственно это тоже будет number и тоже со значением 777. Переменная «d» будет типа null и содержать в себе единственное возможное для типа null значение null. Создав эти переменные мы отображаем их значения на экран и выводим все те значение, которые тут мы определили. Если же мы попытаемся получить доступ к переменной, которую не создавали, вот как на строке 24, то эта строчка кода становится ошибкой. На этой строчке интерпретатор прекращает интерпретировать все, что мы определили в сценарии и код находящийся ниже просто прекращает работать. Поэтому 24 строчка и все строчки кода, которые мы могли бы написать ниже, они не перестанут работать. Давайте проверим. Вот первая переменная undefined, потом обе переменные «b» и «c» со значением 777, переменная «d» – null. Последняя переменная – она у нас отсутствует. Если мы чтобы проверить, что действительно весь код перестает работать, если мы этот код поставим в начало, интерпретатор первое дело, что сделает – это выполнит эту строку, получит здесь ошибку и не сможет выполнять код идущий далее. Давайте запустим. Видите, в таком случае у нас вообще ничего не отображается. Поэтому следите за использованием переменных, не используйте переменные если вы их не определяли. То есть если мы хотя бы создали переменную, как только мы ее с помощью ключевого слова var определили, эта переменная остается, тип этой переменной undefined, значение этой переменной undefined. Дальше мы эту переменную можем спокойно использовать. А вот если вы пытаетесь читать переменные, которых нету, вот к чему это приводит. Приводит к ошибке.
Теперь давайте посмотрим, что такое область видимости. В следующем примере мы разберем с вами понятие глобальной и локальной области видимости. В языке JavaScript есть только две области видимости. Глобальная – это область видимости, где работают все наши сценарии. И локальная область видимости. Это область видимости, отдельной функции. Если вы работали в языке C# или С++ у вас есть глобальная область видимости и локальная область видимости, которая определяется функцией, которая определяется условием, циклом. В языке JavaScript таких вложенных областей видимости просто не существует. Либо у нас глобальная область видимости, либо область видимости функции. Если мы собираемся создать переменную глобальную, которая будет доступна абсолютно всем сценариям текущего приложения, текущего документа, нам нужно просто создать переменную в теге <script>. Если мы создаем var global, эта переменная становится глобальной, потому что она не находится внутри функции. Если мы определяем функцию и создаем переменную с ключевым словом var внутри функции, то эта переменная будет доступна только в теле этой функции. Получается глобальная область видимости, вот она, вот то что мы нарисуем сейчас красным цветом – это и есть глобальная область видимости. А локальная область видимости это вот эта вот часть, только то, что находится в функции. Глобальная область видимости, если мы создаем переменную, вот здесь, global, если мы ниже создадим еще один тег скрипт, то тег скрипт будет представлять глобальную область видимости и в новом скрипте переменная global тоже будет существовать. То есть глобальные переменные – они общие. Они доступны даже тем JavaScript сценариям, которые разрабатывали другие разработчики. Если этот JavaScript сценарий подключить к вашей странице, то чужой JavaScript код может видеть ваши глобальные переменные. То есть почему они глобальные? Потому что доступны абсолютно всем. А вот локальные переменные, они доступны только в той области, в которой мы их создавали. Область видимости создается вот фигурными скобками, операторными скобками, все, что между этими скобками находится – это одна область видимости. Эта область видимости можем использовать свои локальные переменные и так же эта область видимости так как она находится внутри глобальной области видимости, эта область видимости может получать доступ также и к глобальным переменным. Вот сейчас мы на 20 строке увидим, что переменная global у нас доступна в функции F. Мы увидим здесь текс глобальная переменная. И также мы увидим, что доступна локальная переменная, на 21 строке мы увидим текст локальная переменная. Функцию мы определили, на строке 26 функцию мы эту запускаем, то она начинает у нас работать, создает локальную переменную, выводит все эти сообщения. После запрещения функции мы отображаем значение глобальной переменной. Мы увидим, что и здесь переменная была доступна и здесь переменная доступна у нас, видно текст глобальная переменная, но вот на 31 строчке отображение к локальной переменной уже ни к чему не приводит. Локальная переменная здесь неопределенна, локальна переменная доступна только в этой области видимости, то есть вот этой локальной области видимости. Поэтому на строке №31 мы не имеем права обращаться к переменной local, ее просто здесь не существует. Если бы переменную local отсюда подняли выше и поставили ее после глобальной, тогда переменная local, она по сути имела глобальную область видимости. А в этом случае, вот в таком варианте использования как на 31 строке, это у нас обращение по сути к несуществующей переменной. Давайте запустим и проверим. Глобальная и локальная переменная. То, что выводится функцией, видите, цвет navy, вот у нас отобразились данные, а потом, когда мы попытались вывести значения global и local за функции, то первая строчка отобразилась, а вторая строчка стала причиною ошибки, потому что переменная неопределенна. Переменную мы не смогли запустить.
В следующем примере показано, что произойдет если в глобальной области видимости находится переменная, которая называется точно так же, как и переменная заложена в локальную область видимости. На 15 строке создается глобальная переменная с именем global, на строке 18 еще одна переменная с именем local, но эта переменная глобальная, потому что вы видите, она определена в теге <script>, не внутри функции, а вот в скрипте. В самой функции F на строке 23 создается еще одна переменная с именем local. Имена этих переменных совпадают, но пока будет работать функция F, значение этой переменной временно будет перекрывать значение глобальной переменной, поэтому на строке 26, когда мы обращаемся к переменной с именем local, мы обращаемся к данной переменной, а когда мы закончим работу в этой функций, когда мы обратимся к переменной local на 34 строчке, то по сути мы будем работать с переменной, которая находится на 18 строке, будем выводить это значение. Получается, что внутри функции мы можем перекрывать значение глобальных переменных, если создадим локальную переменную с тем же именем, что и у глобальной. Вот видите глобальна переменная локальная переменная, а потом после выхода за функцию вот у нас есть глобальная и еще одна глобальная переменная. То есть на строке 34 мы на самом деле обращаемся к значению, которое устанавливалось на строке 18. А на строке 26 мы обращаемся к значению, которое устанавливалось на 23 строке. Вот это такая вот особенность работы с локальными и глобальными функциями.
В №4 примере показана ошибка, которую очень часто могут допускать разработчики. Всегда создавая переменную используйте ключевое слово var. Потому что если вы не установите ключевое слово var, это может привесит к следующему поведению. Вот на строке 19 мы определяем функцию. На 22 строчки создаем переменную с именем global, но не используя ключевое слово var. Если мы не устанавливаем ключевое слово var, это означает, что мы создаем глобальную переменную. Получается, что здесь эта переменная доступна как внутри этой функции, так как она глобальная, так и за пределами этой функции. На строке 35 мы имеем доступ к переменной global. Вот когда эта функция запускается – переменная global создается, а потом, когда на 35 строке мы к этой переменной обращаемся, мы видим ее результат – глобальная переменная, точнее ее значение. Видите, глобальная переменная вот вывелась на строке 24 и вторая строчка это вывелось на строке 35. Давайте проверим что произойдет если мы раскомментируем 30 строку, раскомментируем и запустим. Видите, браузер не отобразил никаких сообщений. Почему так произошло? Функцию на 19 строке мы определили, но код, который там находится еще не срабатывал. Далее на 30 строке мы обращаемся document.write, выводим в тело документа сообщение, и это значение, которое мы собираемся отобразить, это переменная global. Переменная global не была определена, переменная global создается только тогда, когда выполняется код заложенный в функции. А вы помните, чтобы код, находящийся в функции, запустился, выполнился, функцию необходимо запустить. Запускаем мы функцию на 32 строчке, то есть вот здесь, после того, как выведем значение глобальная переменная. Поэтому на строке 30 из-за отсутствия переменной у нас происходит ошибка, интерпретатор не в состоянии выполнять код, соответственно не выполняются ни это, ни следующие строчки кода, которые здесь заложены. Поэтому здесь у нас все прекращает работу. Если мы функцию перенесем на строку, например, 17, если мы ее вызовем раньше, то в таком случае у нас создается переменная, мы сможем с этой переменной работать на 30 и на 35 строке. Либо другой вариант, мы можем просто розкоментировать 16 строку и создать глобальную переменную на 16 строчке, вывести ее на 30 строке, а потом, когда мы запустим функцию, на строке 22 мы просто переопределим значение глобальной переменной, перепишем это значение, которое было создано здесь. Из-за того, что код, который мы создаем з глобальными переменными внутри функции получается такой вот неоднозначный и запутанный. Старайтесь всегда создавая переменную функции использовать ключевое слово var, потому что таким образом вы четко говорите, что данная переменная – локальная, она работает только в этой функции. Соответственно никаких проблем с понимаем к какой переменной вы сейчас обратитесь к локальной или глобальной никаких проблем не возникает. Возьмите себе за правило. Создавая переменную всегда используйте ключевое слово var.
Теперь следующий пример. Локальных областей видимости у нас может быть несколько, то есть каждая функция выступает своей собственной локальной областью видимости и из одной локальной области переменная не может быть получена в другой локальной области. Вот в примере, который мы сейчас открыли, у нас есть две функции, функция «а» и функция «b», эти функции мы на 38-39 строке вызываем. В функции «а» у нас создается локальная переменная с именем «а» и ее значение отображается на экран. В функции «b» локальная переменная «b», и тоже значение выводится на экран. Сейчас у нас есть по сути три области видимости в этом примере. Есть первая область видимости – глобальная, вот эта вот область видимости, вторая область видимости – это вот эта локальная функция «а» и область видимости локальная для функции «b». Между этими областями видимости мы не можем иметь никакого взаимодействия, то есть если расскоментировать эту строчку, в переменную «b» в локальной области видимости функции «а» мы не получим. То есть здесь мы можем работать только с теми переменными, которые были созданы в области видимости функции «а». И тоже самое касается с областью видимости функции «b», тут мы можем работать только с теми переменными, которые были созданы здесь, в этой области видимости. Ну а глобальная область видимости она и на то глобальная, то есть то что было создано в глобальной области видимости будет доступно и для функции «b» и для функции «а». Если мы так код запустим – он срабатывает, обе переменные выводится и если мы рассоментируем обращение к переменной «b», которое не существует в переменной «а», в функции «а», у нас выведется вот 21 строчка код сработает, а потом выводится исключение для интерпретатора и на 25 строке интерпретатор перестанет работать и перестанет выполнять все инструкции, которые заложены в нашем коде.
Следующий пример еще объясняет дополнительно работу области видимости. Я думаю, что многие из вас, кто работал с каким-нибудь другим языком программирования, увидев этот пример подумает, что язык JavaScript очень странный и непонятный язык. Мы работая с другими языками программирования привыкли, что если мы создаем условия, если мы создаем цикл, какую-то конструкцию, если в этом допустим цикле мы создаем переменную, то переменная доступна только для цикла. За пределами цикла переменная использоваться уже не будет. Но из-за того, то в JavaScript есть только две области видимости – глобальная и локальная – область видимости при создании цикла она у нас не появляется просто, вот из-за этого она у нас есть такие достаточно интересные поведение в коде. Когда на 14 строке создается цикл, мы указываем, что в цикле есть счетчик, изначальное значение его ноль, цикл будет работать до тех пор, пока счетчик меньше трех и на каждой итерации будет просто увеличивать счетчик. Вот все, что делает цикл. В большинстве языков программирования счетчик, который мы создали в цикле будет доступен только вот в этой части кода. То есть вот в той области видимости, в которой была создана вот данными фигурными скобками. На самом деле, когда на 14 строке мы создаем вот эту переменную, мы создаем ее по сути, как глобальную переменную, потому что мы не находимся сейчас в функции. Переменная counter становится глобальной, она доступна как к этому циклу, так и всем другим сценариям, которые есть в этом приложении. Поэтому на 19 строке, когда мы еще раз выводим сообщение, обращаемся к counter, у нас все корректно срабатывает. Переменная counter доступна даже после того, как цикл завершил свою работу. Видите, 0,1,2 это то, что выводилось в счетчике, в цикле точнее, а настройке 19 вот желтым цветом вывелся блок с счетчиком, и мы видим счетчик у нас продолжает работать, мы имеем доступ. Для тех, кто перешел в JavaScript с другого языка программирования, это достаточно такое странное поведение. Но я думаю, что вы привыкнете к такому использованию областей видимости.
И №7 пример также показывает особенности работы областей видимости в функциях, локальных областей видимости. По сути, код, который мы сейчас видим, это по сути тот же код, который и в №6 примере, но мы создали функцию в которую поместили цикл и вывод значение счетчика. И сейчас мы видим, что на строке 16 мы создали счетчик, мы так же проверили счетчик, использовали его для создания цикла, но когда мы закончили цикл, на 21 строке счетчик все-равно для нас доступен. Если в предыдущем примере мы создали счетчик как глобальную переменную, то сейчас мы создали счетчик как локальную переменную и получается, что все так же виден вот в этой области видимости. Если мы его создали где-нибудь в функции, он доступен во все этой функции. В других языках программирования вот эти фигурные скобочки, они бы тоже считались бы областью видимости, у нас бы еще появилась область видимости для цикла for, но это не пройдет в JavaScript коде, в JavaScript коде область видимости только одна, область видимости функции, поэтому создав переменную, эта переменная будет доступна в любой части функции. И кстати очень такой важный пример, который мы не показываем в этих примерах, но вы можете столкнутся с таким кодом, вы можете написать его и не понимать, почему у вас код работает неправильно. Если вы создаете переменную, вот, например, var «а» вот здесь, в конце, допустим создаете и устанавливаете для этой переменной значение 1. Переменную «а» вы можете начать использовать в самом начале. alert «а». Она будет работать, потому что интерпретатор в JavaScript коде работает по следующему принципу. Когда интерпретатор видит, что у вас есть функция, первое, что делает интерпретатор – это проходится по всей функции, собирает все переменные, которые тут находятся. То есть еще до того, как запустится код в функции, интерпретатор будет знать, что у вас есть переменная counter и переменная «а». Когда интерпретатор соберет информацию об этих переменных, он изначально создаст их, переменные будут со значением undefined. И вот зная о переменных, интерпретатор начнет выполнять уже код. На строке 15 первое, что сделает этот интерпретатор выполнит alert и выведет значение переменной «а». Но так как переменная «а» у нас будет инициализирована только на 22 строке, а интерпретатор уже знает о ее существовании, то сейчас на 15 строке мы увидим значение undefined. А вот здесь, после инициализации, мы уже увидим значение 1. Видите undefined, выполнится цикл и значение 1. Поэтому будьте осторожны при объявлении переменных. Очень часто JavaScript разработчики всегда эти переменные определять вначале функции. Вот есть даже такой шаблон. Вы пишете ключевое слово var, потом определяете первую переменную, потом вторую переменную, допустим, третью переменную, определяете все переменные вначале, а потом уже используете их в оставшееся части функции. Вот можете для себя пользоваться таким же правилом. Объявили переменные, возможно присвоили этим переменным стартовые значения, а потом уже начинайте этими переменными пользоваться. Это будет хороший способ обезопасить себя от этих ошибок, которые мы увидели с вами при определении переменной ближе к концу функции. На этом мы завершаем вторую часть урока, которая посвящена областям видимости.
Третья часть урока, которая посвящена областям видимости. Тереть часть урока – дополнительные варианты использование функции. Начнем мы с вами третью часть с такого понятия как рекурсия или рекурсивный вызов. Рекурсия или самовызов – это запуск функции из самой же функции. Вот на 13 строке определяется функция с именем F. Эта функция принимает параметр counter. На 15 строке counter уменьшается на 1, потом выводится сообщение какое-то значение counter вот сейчас в этой функции. На строке 19 делается проверка. Если counter не равен нулю, то в таком случае мы еще раз запуская функцию F, передавая counter, который был уменьшен. То есть со строки 20 мы прыгаем на строку 13 и повторно запускаем этот же код, уменьшаем counter, выводим сообщение и делаем проверку – если counter еще не равен нулю, повторно запускаем сами себя. То есть вот это и есть сама рекурсия, рекурсивный вызов, когда функция запускает сама себя. Первая часть запуска функции будет выводить вот это сообщение, но когда у нас на 19 строке условие у нас не сработает, и мы не попадем в строку 20, не сможем запустить сами себя, то тогда все функции, которые мы запускали, они начнут выводить вот это сообщение, значение счетчика, которое было после запуска. Сейчас мы попробуем это графически отобразить, чтобы вы понимали, как это все работает. Видите, вначале срабатывала первая часть функции, вот 17 строчка – счетчик был 2, 1, 0. А потом вторая часть функции, на 22 строчке вывела счетчика 0, 1, 2. Более подробно рекурсивный вызов рассматривается на курсе C# Starter, так как это основы программирования, но мы сейчас с вами тоже потратим немножко времени для того, чтобы понять как именно работает этот код, почему у нас так странно отображаются сообщения, почему вначале выводится 2, 1, 0, потом 0, 1, 2. Давайте сейчас представим, что функция, которую мы сейчас запускаем вот это наша функция, вот то что сейчас нарисую это есть функция F. В первой части функции мы счетчик уменьшаем, ведь изначально, когда на 25 строке мы запускаем функцию, мы передаем в счетчик значение три. Вот получается, что если сюда в counter попало значение три, то на 15 строчке счетчик уменьшается до двойки и это значение мы отображаем. На строчке 19, вот в этой вот функции мы делаем проверку counter не равен нулю. Так как counter сейчас равен 2, то на 20 строке мы запускаем сами себя же. То есть вот здесь у нас идет условие и в этом условии мы запускаем свою же функцию. Запускаем еще одну функцию, передаем в эту функцию счетчик, который вот здесь равен 2, в этой функции счетчик уже будет равен 1, потому что на 15 строке мы его уменьшим, счетчик равен 1, мы этот счетчик выводим, а потом на 19 строке делаем проверку, счетчик не ноль – да, о не ноль, вот здесь значение 1, поэтому вот здесь в условии, в этой копии функции мы условие проходим, попадаем в само условие и еще раз вызываем сами себя, вызываем еще такую же функцию, передавая в эту функцию счетчик со значение 1. То есть в этой локальной области видимости у функции в счетчике будет значение ноль, потому что на строке 15 эта функция счетчик уменьшает. Раз у этой функции значение ноль, мы это значение выведем, на 19 строке условие уже не срабатывает, то есть мы не можем вызвать функцию еще раз, потому что счетчик равен нулю, мы это условие проходим и на 20 строке выводим сообщение уже другим цветом, желтым цветом выводим значение счетчика ноль. Но как вы видели в предыдущих примерах, когда мы функцию запустили, мы перешли в тело функции, выполнили тело функции и вернулись обратно в ту часть кода, где мы функцию запускали. Вот вы видите, мы функцию выполнили, теперь нам нужно перейти обратно и завершить те предыдущие функции которые у нас остались. Как только вот здесь мы до конца выполняем вот эту функцию, мы возвращаемся вот туда, в точку вызова, где в предыдущую функцию и выводим желтым цветом значение счетчика, которое было в этой функции, то есть вот 22 строку, которая выполняется для этой копии функции. Выводим значение 1, уже желтым цветом. Когда эта функции до конца выполняется, она возвращается в ту часть кода, где была вызвана, возвращается в эту функцию, и эта функция соответственно тоже выводит желтым цветом значение 2, значение своего счетчика. Вот и получается, что у нас при рекурсивном вызове в нас вначале вывелось 2, потом 1, потом 0. Потом эта функция не сможет рекурсивно запустить саму себя еще раз, поэтому вывела нолик, который во второй части функции, вернулась в предыдущую функцию – вывела 1, в предыдущей функции вывела 2. Поэтому у нас получилось 2, 1, 0 и 0, 1, 2. Вот так работает рекурсивный вызов. Для чего может использоваться рекурсивный вызов?
В примере №2 мы посмотрим, как можно с помощью саморекурсии посчитать факториал. На строке 7 мы попросим пользователя ввести значение, на строке 8 конвертируем это значение в целочисленное, потом у нас идет функция, сейчас мы разберем, что она делает, а на 18 строке мы выводим факториал вот этого числа, знак восклицания, вы знаете как записывается факториал цифрой и знак восклицания, а потом результат, который возвращает функция, факториал с параметром input. То есть факториал – это произведение нескольких чисел. Если мы скажем 4! – это означает, что нам нужно 1*2*3*4 и вот этот результат, результат умножения, это и будет факториалом. Как мы можем делать вот так, чтобы сюда мы передаем значение 4, а в результат получаем 1*2*3*4, то есть произведение вот всех этих натуральных чисел. Мы можем создать функцию факториал, которая будет саморекурсивно работать. Когда мы запускаем функцию, первое что она проверяет – значение переменной «х», то есть параметра, который сюда попал. Если параметр меньше или равен 1, то мы возвращаем 1. Но если это условие не срабатывает, на строке 15 мы берем «х» и умножаем «х» на вызов этой же функции, факториал, но с уменьшенным значением «х» *1. Поэтому, когда мы сюда передаем значение 4, мы умножаем 4 на результат умножения 4-1, в свою очередь, в той функции, которую мы запустим будет результат умножения 3-1, а во вложенной функции 2-1. То есть в итоге у нас получится, что из-за этого рекурсивного вызова мы получим каждый раз факториал возвращает 1, потом результат умножения 2 на 1, потом результат умножения 3*1 и результат умножения 4 на все предыдущие результаты. И в итоге вот это рекурсивный вызов даст нам факториал указанного числа. Давайте попробуем. Введем число 4, Факториал 4 – 24. Введем значение 20, факториал числа будет вот таким большим значением.
Следующая интересная возможность, которая встречается в JavaScript – это создания функций-литералов. Так как функция – это тип данных, мы можем спокойно создать переменную и в эту переменную присвоить функцию. На 13 строке создается переменная с именем F. И в эту переменную, вместо обычного значение, которое мы привыкли присваивать, записывается функция. Вот это и есть функция-литерал, потому что мы создали по сути значение, которым инициализируем переменную. Тип переменной F – function. Если вы вспомните самый первый наш урок, на слайде мы разбирали, что один из типов данных – это функция. Вот мы видим, что действительно можем создать переменную типа функция. Вот мы сейчас это видим на 13 строке. Функция, которую мы присваиваем переменной, мы не устанавливаем этой функции имя, то есть по сути эта функция – это анонимная функция безымянная функция, мы ее не можем запустить просто так, само по себе, потому что мы не знаем, как она называется. Но когда эта функция находится в переменной F. По сути имя функции это есть имя переменной и на строке 17, когда мы обращаемся к переменной F, так как в переменной находится функция, чтобы эту функцию запустить, нам нужно установить круглые скобки после переменной. Вот у нас по сути запуск функции, не важно, как она была определена, либо как отдельное объявление функции, либо функциональный литерал, запуск функции всегда выглядит одинаково. Вот мы запустили функцию, которая выведет сообщение Hello. На строке 20 мы переменную “f” взяли и переприсвоили ей значение, записали в переменную новую функцию. Старую функцию, которая хранится в переменной мы выбросили, а новая функция теперь выводит сообщение bye. Проверяем на 24 строке, вызываем функцию, видим, что здесь уже выводится сообщение bye. Вот Hello, а второй раз bye. В этом примере мы увидели, как использовать функции bye. В следующих курсах мы будем очень часто принимать эти функции, когда мы создаем обработчики на события, мы тоже будем изучать такую тему, очень часто мы используем функции литералы. Так же в JavaScript коде можно сделать, чтобы функция в себе содержала вложенную функцию. Это не является ошибкой, это даже приветствуется. На строке 13 определяется функция с именем author. На строке 15 мы вызываем функцию inner. Мы видим, что функция inner она у нас определена вот, на строке 17. Вот фигурные скобки, которыми определяется тело функции author, мы видим, что между этими скобками находится еще одно определение вложенной функции с именем inner. Эта функция выводит параграф с текста – inner-function. И вот мы эту inner function вызвали на 15 строке и ее же вызвали на 21 строке, но для того, чтобы этот код заработал, на строке 24 мы запускаем функцию author. Когда мы вызываем на 24 строке author функцию, у нас начинает выполняться 15 строка и 21 строка. И по сути функция inner, она доступна только для локального кода, для функции author. За пределами функции author к этой функции мы обращаться не будем. Поэтому это один из принципов инкапсуляции. Если вы сталкивались с этим термином, то в JavaScript мы можем прятать какую-то функциональность с помощью вот таких вложенных функций.
В следующем примере показан пример использования таких вложенных функций. На строке №13 у нас есть функция, которая будет считать гипотенузу. В эту функцию мы передаем два параметра «а» и «b», и на 15 строке внутри функции гипотенуза у нас есть функция pow, то есть power, возведение в квадрат. Эта функция принимает один параметр и возвращает как бы этот параметр умноженный сам на себя. Просто «х» в квадрате. На строке 19 мы используем библиотеку Math, точнее не библиотеку, а объект Math. С этим объектом мы еще не сталкивались, но рекомендую его посмотреть, посмотреть его содержимое, его методы. Видите, что в этом объекте есть различные функции для получение синуса, косинуса, различных констант, например, число пи и так далее. Вот мы сейчас на объекте масс вызываем функцию sqrt. sqrt– это квадратный корень. Вот мы вызываем квадратный корень, а в квадратный корень, точнее в параметр, передаем значение квадрат «a», и квадрат «b». Вот мы вызываем локально эту функцию, которая доступна только нам, получаем квадрат «a», квадрат «b», и возвращаем результат в виде квадратного корня. Этот квадратный корень мы выводим на 22 строке. Вот мы вывели результат.
И в последнем примере мы разберем то как можно еще использовать функции. Так как функция – это тип данных, то мы без проблем можем передать функцию в качестве аргумента другой функции. Посмотрите сейчас на текущий пример. На строке 14 создается переменная с именем add и в эту переменную записывается функция, принимающая два параметра. На 18 строке – переменная sub, функция, которая тоже принимает два параметра, но эта функция у нас выполняет вычитание, а на 15 строчке – сложение. На 24 строке у нас есть функция show, которая принимает три аргумента. Первый аргумент имеет имя CallBack Function. Если вы встречаете такую фразу как CallBack, вот вообще термин CallBack, это функция обратного вызова. Это означает, что сюда, в функцию show, когда мы ее вызываем мы в эту функцию в качестве параметра должны передать еще одну функцию, CallBack функцию. И эта CallBack функция в какой-то определенный момент времени будет запущена. То есть функция show сама решит, когда нужно запустить CallBack Function. Запустит этот CallBack Function и по сути на оповестит. Можете воспринимать CallBack Function как допустим вы запускаете функцию show, и передаете функции show свой номер телефона, чтобы функция show, когда она что-то там надумает, смогла позвонить и оповестить о каких-то изменениях. CallBack Function – это функция, которую нужно запустить для того, чтобы оповестить наш код о каких-то изменениях. Можете воспринимать для простоты вот так эту функцию. Значит мы запускаем show, передаем три параметра – CallBack, «а» и «b». И смотрите, что мы делаем на 26 строке. Мы подразумеваем, что CallBack Function она умеет выполоть какие-то действия над двумя переменными. Выполнять какие-то действия, получить результат и потом с этим результатом что-то делать. Вводить его каким-то красивым способом на страницу, отправлять куда-то на сервер, то есть делать какие-то с ним операции. Вот получается, что на 26 строке мы запускаем CallBack Function, которая первым параметром была передана, в эту функцию передаем значение, которые были получены здесь в качестве аргументов «a» и «b». То, что функция возвращает мы записываем в переменную result, а потом что-то с этой переменной делаем. Выводим в документ или еще какие-то операции делаем. То есть задача функции show, получать на вход функцию, которая будет производить вычисления, получать на вход параметры, над какими нужно производить вычисления, запустить функцию, передать в эту функцию параметры, получить результат и что-то сделать с результатом. И вот строка 32, мы просим функция show, покажи то что произойдет, если взять функцию add, взять значение 10 и 20. То есть функции show мы сейчас передаем add метод, вот эту функцию, бросаем функцию show, бросаем в функцию show значение 10, значение 20. И в результате видим, что у нас сумма двух этих значений отображается в параметре. Строка 34, просим, чтобы функция show взяла функцию sub, провела вычитания, 50-30 и результат вывела в документ. Вот таким способом мы отображаем результат. Суть этого примера показать, что вы можете спокойно делать функции аргументами других функций. Вы можете функцию передать в качестве аргумента. А другая функция может воспользоваться переданной функцией, что-то с ней здесь, вызвать ее, посмотреть на результат, выполнить любые операции. В будущем вы еще не раз столкнетесь с CallBack функциями, особенно если будете работать с различными библиотеками, например, с JQuery библиотекой, moottolls, вы будете постоянно передавать CallBack функции в чужой код, чтобы чужой код вам выдавал оповещение, чтобы чужой код вызывая вашу CallBack функцию оповещал вас о каких-то изменениях. Но с этим мы еще с вами поговорим отдельно.
На этом мы заканчиваем №4 урок, посвященный функциям, в этом уроке мы рассмотрели, как определяются функции, мы разобрали с вами различные области видимости, которые существуют в JavaScript коде, узнали, что есть глобальная и локальная область видимости и посмотрели несколько примеров, которые показали нам что такое саморекурсия, что такое функция, литералы и мы увидели, что функция – это тип данных и соответственно функцию мы можем передавать в качестве параметра в друге функции. На этом урок, посвященный функциям мы заканчиваем. Спасибо за внимание. До новых встреч.
«Чистые» и «нечистые» функции в JavaScript
«Чистые» функции — это любые функции, исходные данные которых получены исключительно из их входных данных и не вызывают побочных эффектов в приложении. Математические функции являются примерами «чистых» функций.
«Нечистые» функции бывают разных форм и размеров. Вот некоторые примеры:
- функции, вывод которых зависит от внешнего / глобального состояния;
- функции, которые возвращают разные исходные данные при одинаковых входных;
- функции, которые изменяют состояние приложения;
- функции, которые изменяют «внешний мир».
Функциональное программирование основано на использовании «чистых» функций и строгом контроле побочных эффектов. Способность распознавать любой тип функции является ключевым для функционального программирования.
«Чистая» функция — это функция, которая выводит свои данные основываясь исключительно на свои входные данные и не вызывает побочных эффектов в приложении.
Например у нас есть функция, которая получает одно значение x
и возвращает в данном случае x + 1
:
Довольно легко понять, что это «чистая» функция. Мы получаем тот же результат при вызове этой функции, с тем же входным значением; плюс у нас нет внешних зависимостей, которые бы вызывали побочные эффекты. Чтобы понять это далее, давай сравним это с несколькими «нечистыми» функциями.
Первая «нечистая» функция
Первая «нечистая» функция, которую мы собираемся сделать — это та, чей результат не основан исключительно на её входных данных. Например, давай рассмотрим функцию totalPrice
. У нас есть глобальная переменная —COST_OF_ITEM
, которая содержит цену на товар. Функция totalPrice
берет quantity
и умножает ее на эту переменную.
const COST_OF_ITEM = 250;
const totalPrice = quantity => COST_OF_ITEM * quantity;
На первый взгляд может показаться, что это «чистая» функция, потому что мы всегда получаем один и тот же результат на основе одного и того же входного значения. Это можно увидеть, вызвав её несколько раз с одним и тем же значением, и вывив в консоль. В обоих случаях мы получаем 500.
const COST_OF_ITEM = 250;
const totalPrice = quantity => COST_OF_ITEM * quantity;
console. log(totalPrice(2));
console.log(totalPrice(2));
Хоть мы и получаем тот же результат, но это «нечистая» функция, так как состояние нашего приложения влияет на вывод нашей функции. Мы можем увидеть это, изменив значение COST_OF_ITEM
и посмотреть снова в консоль.
const COST_OF_ITEM = 200;
const totalPrice = quantity => COST_OF_ITEM * quantity;
console.log(totalPrice(2));
console.log(totalPrice(2));
Вторая «нечистая» функция
Наш второй пример «нечистой» функции — это функция, которая получает один и тот же аргумент, но возвращает разные результаты. Часто в наших приложениях нам нужно создавать объекты, которые имеют уникальные идентификаторы, такие как id
.
Давай создадим функцию generateID
. Эта функция будет возвращать целое число в случайном порядке. Это «нечистая» функция, так как вызвав её несколько раз, каждый раз мы получим разный результат.
const generateID = () => Math.floor(Math.random() * 10000);
console.log(generateID());
console.log(generateID());
console.log(generateID());
Давай используем нашу «нечистую» функцию generateID
внутри фабричной функции для создания пользовательских объектов. Чтобы создать пользователя, createUser
принимает два параметра: name
и age
, и возвращает объект с id
, используя функцию generateID
для его создания, а также name
и age
.
const generateID = () => Math.floor(Math.random() * 10000);
const createUser = (name, age) => ({
id: generateID(),
name,
age
});
Вызовем createUser
несколько раз, с одинаковыми аргументами.
const generateID = () => Math.floor(Math.random() * 10000);
const createUser = (name, age) => ({
id: generateID(),
name,
age
});
console.log(createUser("Alex", 28));
console. log(createUser("Alex", 28));
console.log(createUser("Alex", 28));
Если посмотрим в консоль, то увидим, что мы получили похожие объекты, но они не одинаковые — id
у всех разный.
«Нечистота» функции generateID
делает нашу фабричную функцию createUser
«нечистой». Для того чтобы исправить это — можно переместить «нечистую» функцию за пределы фабрики и вызвать её где-нибудь, где мы ожидаем побочный эффект, и передать id
в качестве параметра в нашу фабрику createUser
.
Третья «нечистая» функция
Третий пример. Как и в примере с глобальной переменной, мы можем создавать функции, которые изменяют состояние нашего приложения, вызывая побочный эффект.
Допустим, мы отслеживаем изменяемое значение (в данном случае id
). Если мы создадим функцию, которая изменяет это значение, у нас будет «нечистая» функция. Например фабричная функция createPersone
.
let id = 0;
const createPersone = name => ({
id: ++id,
name
});
Если мы генерируем наш id
для этого объекта, изменяя значение глобального id
, то это «нечистая» функция. Вызвав эту функции несколько раз с разными name
, то увидим, что id
увеличился как мы и ожидали, но если мы также выведем в консоль глобальное значение id
, то увидим, что оно тоже изменилось.
let id = 0;
const createPersone = name => ({
id: ++id,
name
});
console.log(createPersone("Alex"));
console.log(createPersone("Julia"));
console.log(id);
Четвертая «нечистая» функция
Последний четвертый пример «нечистой» функции — это побочный эффект “внешнего мира”. console.log
— «нечистая» функция, так как она создает побочный эффект во “внешнем мире”.
Каждый раз, когда мы используем console.log
, это влияет на нашу консоль, а это побочный эффект. Если у нас есть какая-либо функция, использующая console.log
, (например, функция logger
, которая принимает сообщение и выводит его) это тоже «нечистая» функция.
const logger = msg => {
console.log(msg);
};
logger("Всем привет!");
Функции работы с массивами (Array) на JavaScript
Функции работы с массивами на JavaScript
Массив (Array) это множество однородных предметов или элементов, объединенных в единое целое по определенному признаку. Простыми словами это упорядочный список из элементов, которые имеею свой тип данных
Практически любая разработка FrontEnd версии сайта не обходится без массивов, поэтому работать с массивами должен уметь каждый программист!
Основные функции для работы с массивами в JavaScript
Создание массива Array
Создание двумерного Array
Получение длинны массива
Простое создание массива Array
Доступ к значению массива по индексу (порядковому номеру)
Обход массива в JavaScript
Добавление элемента массива в конец
Удаление последнего элемента массива
Удаление первого элемента массива
Добавление элемента в начало массива
Поиск номера элемента в массиве
Удаление элемента с определённым индексом
Удаление нескольких элементов, начиная с определённого индекса
Создание копии массива
Получение массива через объект
Экземпляры массива в JavaScript
Все экземпляры массива наследуются от Array.prototype и любые изменения в объекте прототипа конструктора массива затронет все экземпляры Array.
Свойства
Array.prototype.constructor
Определяет функцию, создающую прототип объекта.
Array.prototype.length
Отражает количество элементов в массиве.
Методы изменения
Array.prototype.copyWithin()
Копирует последовательность элементов массива внутри массива.
Array.prototype.fill()
Заполняет все элементы массива от начального индекса до конечного индекса указанным значением.
Array.prototype.pop()
Удаляет последний элемент из массива и возвращает его.
Array.prototype.push()
Добавляет один или более элементов в конец массива и возвращает новую длину массива.
Array.prototype.reverse()
Переворачивает порядок элементов в массиве — первый элемент становится последним, а последний — первым.
Array.prototype.shift()
Удаляет первый элемент из массива и возвращает его.
Array.prototype.sort()
Сортирует элементы массива на месте и возвращает отсортированный массив.
Array.prototype.splice()
Добавляет и/или удаляет элементы из массива.
Array.prototype.unshift()
Добавляет один или более элементов в начало массива и возвращает новую длину массива.
Методы доступа к массиву
Array.prototype.concat()
Возвращает новый массив, состоящий из данного массива, соединённого с другим массивом и/или значением (списком массивов/значений).
Array.prototype.includes()
Определяет, содержится ли в массиве указанный элемент, возвращая, соответственно, true или false.
Array.prototype.join()
Объединяет все элементы массива в строку.
Array.prototype.slice()
Извлекает диапазон значений и возвращает его в виде нового массива.
Array.prototype.toSource()
Возвращает литеральное представление указанного массива; вы можете использовать это значение для создания нового массива. Переопределяет метод Object.prototype.toSource().
Array.prototype.toString()
Возвращает строковое представление массива и его элементов. Переопределяет метод Object.prototype.toString().
Array.prototype.toLocaleString()
Возвращает локализованное строковое представление массива и его элементов. Переопределяет метод Object.prototype.toLocaleString().
Array.prototype.indexOf()
Возвращает первый (наименьший) индекс элемента внутри массива, равный указанному значению; или -1, если значение не найдено.
Array.prototype.lastIndexOf()
Возвращает последний (наибольший) индекс элемента внутри массива, равный указанному значению; или -1, если значение не найдено.
Методы обхода массива
Array.prototype.forEach()
Вызывает функцию для каждого элемента в массиве.
Array.prototype.entries()
Возвращает новый объект итератора массива Array Iterator, содержащий пары ключ / значение для каждого индекса в массиве.
Array.prototype.every()
Возвращает true, если каждый элемент в массиве удовлетворяет условию проверяющей функции.
Array.prototype.some()
Возвращает true, если хотя бы один элемент в массиве удовлетворяет условию проверяющей функции.
Array.prototype.filter()
Создаёт новый массив со всеми элементами этого массива, для которых функция фильтрации возвращает true.
Array.prototype.find()
Возвращает искомое значение в массиве, если элемент в массиве удовлетворяет условию проверяющей функции или undefined, если такое значение не найдено.
Array.prototype.findIndex()
Возвращает искомый индекс в массиве, если элемент в массиве удовлетворяет условию проверяющей функции или -1, если такое значение не найдено.
Array.prototype.keys()
Возвращает новый итератор массива, содержащий ключи каждого индекса в массиве.
Array.prototype.map()
Создаёт новый массив с результатами вызова указанной функции на каждом элементе данного массива.
Array.prototype.reduce()
Применяет функцию к аккумулятору и каждому значению массива (слева-направо), сводя его к одному значению.
Array.prototype.reduceRight()
Применяет функцию к аккумулятору и каждому значению массива (справа-налево), сводя его к одному значению.
Array.prototype.values()
Возвращает новый объект итератора массива Array Iterator, содержащий значения для каждого индекса в массиве.
Array.prototype[@@iterator]()
Возвращает новый объект итератора массива Array Iterator, содержащий значения для каждого индекса в массиве.
Комментарии: (0)
Написать комментарий
Малоизвестные функции JavaScript | NOP::Nuances of programming
Считается, что JavaScript — самый простой язык, чтобы начать и самый сложный язык, чтобы полностью освоить. Не могу не согласиться, так как JS очень старый и очень гибкий язык программирования. Он переполнен устаревшими функциями и загадочным синтаксисом. Моя дружба с JavaScript длится уже многие годы, но я до сих пор натыкаюсь на скрытые возможности синтаксиса, о которых прежде никогда не знал.
В этой статье я попытался составить список из наименее известных функций JS. Хотя применение некоторых из данных функций недопустимо в строгом режиме (strict mode), они по-прежнему могут использоваться в JS коде. Однако, имейте в виду, я не призываю вас к тому, чтобы начать использовать все эти функции. Конечно они классные, но, скорее всего, у вас возникнет недопонимание с товарищами по команде, если вы воспользуетесь этими функциями.
Весь исходный код доступен здесь. Удачи!
Примечание: Я не включил в список такие вещи, как Hoisting(поднятие), Closures (замыкания), Proxies (прокси), Prototypical inheritance (наследование), async/await, Generators (генераторы) и т.д. Потому что эти функции довольно известны, несмотря на их сложность.
Оператор Void
В JavaScript есть унарный оператор void. Возможно вы уже видели, что он используется как void(0)
или void 0
. Его единственная цель— вычислить выражение и возвратить значение undefined. Вам не обязательно использовать “0” после void — это просто условность. Вы можете использовать любое допустимое выражение, например, void <expression>
и оно по-прежнему будет возвращать значение undefined.
Зачем создавать специальное ключевое слово, чтобы вернуть undefined, вместо того, чтобы просто вернуть undefined? Звучит чересчур сложно, не так ли?
? Забавный факт
Что же, до ES5 вы могли присвоить новое значение исходному значению undefined, например,
undefined = "abc"
, и это работало в большинстве браузеров. Отсюда и определение неопределенного (undefined)! В те дни, использование оператора void гарантировало, что вы всегда возвращаете исходный undefined.
Использование скобок в методе Constructor (Конструктор) необязательно
Да, скобки, которые мы добавляем после имени класса при вызове Constructor (Конструктора) — совершенно необязательны! (При условии, что вам не нужно передавать какие-либо аргументы Constructor (Конструктору))
Оба нижеприведенных примера кода считаются допустимым синтаксисом JS и дадут вам абсолютно одинаковый результат!
Скобки в функции IIFE можно пропустить
Синтаксис функции IIFE (Immediately Invoked Functional Expression)всегда был для меня немного странным.
Зачем все эти скобки?
Оказывается, дополнительные скобки нужны для того, чтобы сказать JavaScript парсеру, что предстоящий код — это Functional Expression(Функциональное выражение), а не Function (Функция). Теперь, зная об этом, можно пропустить все лишние скобки, при этом функция IIFEбудет все также исправно работать.
Оператор void сообщает парсеру о том, что код является Functional Expression (Функциональным выражением). Следовательно, мы можем пропустить скобки во время объявления функции (function definition). И знаете что еще? Мы можем использовать любые унарные операторы ( void, +, !, -, и т.д.) и все будет по-прежнему работать!
Это так здорово!
Однако, если вы проницательный пользователь, вы можете задаться вопросом: “Не повлияет ли унарный оператор на результат, возвращаемый из IIFE?”
Да, он повлияет на результат. Но если вы храните результат в какой-то переменной, вам не нужны дополнительные скобки.
Мы добавляем эти скобки для лучшей читабельности.
Оператор With
Знаете ли вы, что в JavaScript есть оператор with, который создает новую область видимости “scope” и представляет свойства объекта “object” как локальные переменные выражения “statement”? Синтаксис оператора with выглядит следующим образом:
with (object) statement // for multiple statements add a block with (object) { statement statement ... }
Пример использования оператора with:
? Забавный факт
Использование оператора with не рекомендуется, так как он устарел. Он находится под полным запретом в строгом режиме (strict mode). Оказывается, with невозможно оптимизировать автоматически и нельзя определить куда ссылается переменная. То есть у данного оператора есть определенные проблемы с производительностью и безопасностью.
Function Constructor
Оператор function — не единственный способ объявить новую функцию. Существует еще один способ, использующий constructor (конструктор)Function() и оператор new.
Последний параметр constructor (конструктора) — это код функции в виде строки, а остальные параметры перед ним — это аргументы функции.
? Забавный факт
Constructor (конструктор) Function является прародительницей всех конструкторов в JavaScript. Даже сonstructor Object’s — это сonstructor Function. Следовательно, вызвав
object.constructor.constructor...
достаточное количество раз, в конечном итоге вернет сonstructor Function для любого объекта в JavaScript.
Свойства Function (Функции)
Мы все знаем, что Functions (Функции) — это объекты первого класса в JavaScript. Следовательно, никто не мешает нам добавить пользовательские свойства в Function. Тем не менее, этим редко кто пользуется.
Настраиваемые Functions (Функции)
Допустим, у нас есть функция с именем greet и мы хотим, чтобы она выводила разные приветствия (greeting message) в зависимости от региона (locale), в котором находится пользователь. Регион (locale) также должен быть настраиваемым. Для этого, как показано ниже, мы можем имплементировать (реализовать) функцию, используя свойства функций.
Функция со статическими переменными
Еще один подобный пример. Допустим, вы хотите имплементировать (реализовать) Number Generator (генератор чисел), который генерирует ряд порядковых чисел. Обычно, для отслеживания последнего значения используется Class или IIFE со статической переменной counter. Таким способом мы ограничиваем доступ к counter, а также избегаем загрязнения глобального пространства дополнительными переменными.
Но что если мы захотим считывать или даже видоизменять counter, при этом не загрязняя глобальное пространство?
Ну, мы можем создать Class (класс) с переменной counter и некоторыми дополнительными методами для ее считывания или мы можем полениться и воспользоваться свойствами функции.
Свойства Arguments (Аргументов)
Я уверен, многие из вас знают об объекте arguments
внутри функции. Это объект подобный массиву, доступный во всех функциях. Он содержит аргументы, переданные в функцию во время ее вызова. Также он обладает другими интересные свойствами:
- arguments.callee: Относится к функции, исполняемой в текущий момент.
- arguments.callee.caller: Относится к функции, которая вызвала текущую функцию.
Примечание: Хоть ES5 и запрещает использование
callee
&caller
в строгом режиме, они по-прежнему встречаются во многих скомпилированных библиотеках. Именно поэтому стоит ознакомиться с ними поближе.
Теговые шаблонные литералы (Template Literals)
Если вы не из каменного века, то наверняка слышали о шаблонных литералах. Они появились в 6 редакции стандарта ECMAScript, то есть в ES6. Однако знаете ли вы о теговых (tagged) шаблонных литералах?
Теговые шаблонные литералы позволяют лучше контролировать парсинг шаблонных литералов в строку, путем добавления пользовательского тега перед шаблонным литералом. Tag — это просто функция парсера, которая содержит массив строковых значений, интерпретируемых шаблонной строкой. В итоге, функция tag должна вернуть собранную строку.
В следующем примере, наш пользовательский тег — highlight — интерпретирует значения шаблонного литерала, а также обернет интерпретированные значения в строку result, а конкретнее в элемент <mark> для выделения (highlighting).
Многие библиотеки используют интересные варианты применения этой функции. Ниже приведено несколько примеров:
- styled-components для React
- es2015-i18n-tag для перевода и интернационализации
- chalk для красочных логотипов
Геттеры и Сеттеры
В большинстве случаев JavaScript объекты — простые. Допустим, у нас есть объект user
и мы пытаемся получить доступ к свойству age с помощью user.age
. Мы либо получаем значение свойства age, если оно defined (определено), либо не получаем, если оно undefined (не определено). Все просто.
Но не обязательно должно быть так просто. JavaScript объекты обладают такой концепцией, как Getters и Setters (геттеры и сеттеры). Вместо того, чтобы непосредственно возвращать значение объекта, мы можем написать собственную функцию Getter, которая возвращает все, что мы захотим. То же самое касается установки значения объекта,то есть функции Setter.
Все это позволяет нам использовать такие концепции, как virtual fields(виртуальные поля), field validations (валидация форм), side-effects(побочные эффекты) при геттинге или сеттинге поля.
Геттеры и сеттеры не являются чем-то новым в ES5, они уже были до этого. ES5 просто добавил удобный синтаксис к существующей функции.
Colors — популярная node.js библиотека, отличный пример использования геттеров.
Данная библиотека расширяет класс String и добавляет к нему несколько методов Getter. Colors дает возможность преобразовать любую строку в цветную версию, просто обратившись к свойствам строки, для удобного ведения логов.
Оператор запятая (comma)
В JavaScript есть оператор запятая (comma). Оператор запятая выполняет каждый из его операндов (слева направо) и возвращает значение последнего операнда.
// syntax let result = expression1, expression2,... expressionN
Зачастую, данный оператор используется для передачи нескольких параметров в цикл for
:
for (var a = 0, b = 10; a <= 10; a++, b--)
Иногда он помогает написать несколько операторов в одной строке:
function getNextValue() { return counter++, console.log(counter), counter }
Также он помогает в написании коротких лямбда-функций:
const getSquare = x => (console.log (x), x * x)
Оператор + (плюс)
Хотите быстро преобразовать строку в число?
Просто поставьте перед строкой оператор +. Оператор плюс подходит для отрицательных, восьмеричных, шестнадцатеричных, экспоненциальных значений. Более того, он может преобразовать Dateили Moment.js объекты во временную метку (timestamp).
Оператор !! (Двойное отрицание)
Технически, это не отдельный JavaScript оператор. !! — это просто оператор ! (НЕ), используемый дважды.
Оператор !! используется для преобразования любого выражения в значение Boolean.
Если выражение является истинным значением, оно возвращает true, в противном случае возвращается false.
Оператор ~ (тильда)
Давайте посмотрим правде в глаза — никому нет дела до побитовых операторов. Но мы все же будем их использовать!
Что ж, для оператора Тильда (или Побитовое НЕ) существует сценарий для ежедневного использования.
Оказывается, при использовании с числом, оператор ~ эффективно выполняет ~N => -(N+1)
. Значение этого выражения равно “0” только тогда, когда N == -1
.
Поместив ~ перед функцией indexOf(...)
, мы можем выполнить булевую проверку наличия элемента в String или в Array.
Примечание: В ES6 и ES7 добавили новый метод
.includes()
в String и Array соответственно. Безусловно, это более аккуратный способ, чтобы проверить, существует ли элемент в String или в Array.
Labelled statements
Вы можете применять label
для обозначения циклов, чтобы затем при помощи break
или continue
выходить из цикла или продолжать его работу с новой итерации.
Примечание: В отличие от некоторых других языков, в JavaScript нет оператора
goto
, вы можете использовать метки только сbreak
илиcontinue
.
Перевод статьи Viral Shah: Little known features of JavaScript
функций — JavaScript | MDN
Функции — один из основных строительных блоков JavaScript. Функция в JavaScript похожа на процедуру — набор операторов, выполняющих задачу или вычисляющих значение, но для того, чтобы процедура квалифицировалась как функция, она должна принимать некоторые входные данные и возвращать выходные данные, где существует очевидная связь между вход и выход. Чтобы использовать функцию, вы должны определить ее где-нибудь в области видимости, из которой вы хотите ее вызвать.
См. Также исчерпывающую справочную главу о функциях JavaScript, чтобы узнать подробности.
Объявления функций
Определение функции (также называемое объявлением функции или оператором функции ) состоит из ключевого слова function
, за которым следует:
- Имя функции.
- Список параметров функции, заключенный в круглые скобки и разделенный запятыми.
- Операторы JavaScript, определяющие функцию, заключенные в фигурные скобки,
{...}
.
Например, следующий код определяет простую функцию с именем квадрат
:
функция квадрат (число) {
номер возврата * номер;
}
Функция квадрат
принимает один параметр, называемый числом
.Функция состоит из одного оператора, который говорит, что нужно вернуть параметр функции (то есть число
), умноженный на самого себя. Оператор return
указывает значение, возвращаемое функцией:
номер возврата * номер;
Примитивные параметры (например, число) передаются в функции по значению ; значение передается в функцию, но если функция изменяет значение параметра , это изменение не отражается глобально или в вызывающей функции .
Если вы передаете объект (т. Е. Не примитивное значение, такое как Array
или определяемый пользователем объект) в качестве параметра, и функция изменяет свойства объекта, это изменение будет видно вне функции, как показано ниже пример:
function myFunc (theObject) {
theObject.make = 'Тойота';
}
var mycar = {марка: 'Honda', модель: 'Accord', год: 1998};
var x, y;
x = mycar.make;
myFunc (mycar);
y = mycar.make;
Выражения функций
Хотя приведенное выше объявление функции синтаксически является оператором, функции также могут быть созданы с помощью выражения функции.
Такой функцией может быть анонимный ; у него не обязательно должно быть имя. Например, функция квадрат
могла быть определена как:
const square = функция (число) {возвращаемое число * число}
var x = квадрат (4)
Однако имя может содержать выражение функции. Указание имени позволяет функции ссылаться на себя, а также упрощает идентификацию функции в трассировке стека отладчика:
const factorial = функция fac (n) {return n <2? 1: n * fac (n - 1)}
консоль.журнал (факториал (3))
Функциональные выражения удобны при передаче функции в качестве аргумента другой функции. В следующем примере показана функция map
, которая должна получать функцию в качестве первого аргумента и массив в качестве второго аргумента.
функциональная карта (f, a) {
пусть результат = [];
дайте я;
для (i = 0; i! = a.length; i ++)
результат [i] = f (a [i]);
вернуть результат;
}
В следующем коде функция получает функцию, определенную выражением функции, и выполняет ее для каждого элемента массива, полученного в качестве второго аргумента.
функциональная карта (f, a) {
пусть результат = [];
дайте я;
для (i = 0; i! = a.length; i ++)
результат [i] = f (a [i]);
вернуть результат;
}
const f = function (x) {
вернуть х * х * х;
}
пусть числа = [0, 1, 2, 5, 10];
пусть куб = карта (е, числа);
console. log (куб);
Функция возвращает: [0, 1, 8, 125, 1000]
.
В JavaScript функция может быть определена на основе условия. Например, следующее определение функции определяет myFunc
, только если num
равно 0
:
var myFunc;
if (num === 0) {
myFunc = function (theObject) {
предмет.make = 'Toyota';
}
}
Помимо определения функций, как описано здесь, вы также можете использовать конструктор Function
для создания функций из строки во время выполнения, как и eval ()
.
Метод - это функция, которая является свойством объекта. Подробнее об объектах и методах читайте в разделе Работа с объектами.
Определение функции не означает ее выполнение. Его определение дает имя функции и указывает, что делать при вызове функции.
При вызове функция фактически выполняет указанные действия с указанными параметрами. Например, если вы определяете функцию квадрат
, вы можете вызвать ее следующим образом:
квадрат (5);
Предыдущий оператор вызывает функцию с аргументом 5
. Функция выполняет свои операторы и возвращает значение 25
.
Функции должны быть в области видимости , когда они вызываются, но объявление функции может быть поднято (появится под вызовом в коде), как в этом примере:
консоль.бревно (квадрат (5));
функция square (n) {return n * n}
Область видимости функции - это функция, в которой она объявлена (или вся программа, если она объявлена на верхнем уровне).
Примечание: Это работает только при определении функции с использованием указанного выше синтаксиса (например, function funcName () {}
). Код ниже работать не будет.
Это означает, что подъем функции работает только с объявлениями функции - но не с выражениями функции .
console.log (квадрат)
console.log (квадрат (5))
const square = function (n) {
вернуть n * n;
}
Аргументы функции не ограничиваются строками и числами. Вы можете передавать в функцию целые объекты. Функция showProps ()
(определенная в разделе Работа с объектами) является примером функции, которая принимает объект в качестве аргумента.
Функция может вызывать сама себя. Например, вот функция, рекурсивно вычисляющая факториалы:
function factorial (n) {
если ((n === 0) || (n === 1))
возврат 1;
еще
return (n * факториал (n - 1));
}
Затем вы можете вычислить факториалы от 1
до 5
следующим образом:
var a, b, c, d, e;
а = факториал (1);
b = факториал (2);
c = факториал (3);
d = факториал (4);
е = факториал (5);
Есть и другие способы вызова функций.Часто бывают случаи, когда функцию необходимо вызывать динамически, или количество аргументов функции меняется, или когда контекст вызова функции должен быть установлен на конкретный объект, определенный во время выполнения.
Оказывается, что функций сами являются объектами - и, в свою очередь, эти объекты имеют методы. (См. Объект Function
.) Один из них, метод apply ()
, может использоваться для достижения этой цели.
Переменные, определенные внутри функции, не могут быть доступны из любого места за пределами функции, потому что переменная определяется только в области видимости функции.Однако функция может получить доступ ко всем переменным и функциям, определенным внутри области, в которой она определена.
Другими словами, функция, определенная в глобальной области видимости, может обращаться ко всем переменным, определенным в глобальной области видимости. Функция, определенная внутри другой функции, также может обращаться ко всем переменным, определенным в ее родительской функции, и к любым другим переменным, к которым родительская функция имеет доступ.
var num1 = 20,
число2 = 3,
name = 'Chamahk';
function multiply () {
return num1 * num2;
}
умножить ();
function getScore () {
var num1 = 2,
число2 = 3;
function add () {
вернуть имя + 'забил' + (num1 + num2);
}
return add ();
}
getScore ();
Рекурсия
Функция может ссылаться и вызывать сама себя.Функция может ссылаться на себя тремя способами:
- Имя функции
-
arguments.callee
- Переменная в области видимости, которая ссылается на функцию
Например, рассмотрим следующее определение функции:
var foo = function bar () {
}
В теле функции все следующие эквиваленты:
-
бар ()
-
arguments.callee ()
-
foo ()
Функция, которая вызывает сама себя, называется рекурсивной функцией .В некотором смысле рекурсия аналогична циклу. Оба выполняют один и тот же код несколько раз, и оба требуют условия (чтобы избежать бесконечного цикла или, скорее, бесконечной рекурсии в этом случае).
Например, следующий цикл ...
var x = 0;
while (x <10) {
x ++;
}
... можно преобразовать в объявление рекурсивной функции с последующим вызовом этой функции:
function loop (x) {
если (x> = 10)
возвращаться;
петля (х + 1);
}
петля (0);
Однако некоторые алгоритмы не могут быть простыми итерационными циклами.Например, получить все узлы древовидной структуры (такой как DOM) проще с помощью рекурсии:
function walkTree (node) {
если (узел == нуль)
возвращаться;
for (var i = 0; i
По сравнению с функцией , цикл
, каждый рекурсивный вызов сам по себе делает здесь много рекурсивных вызовов.
Можно преобразовать любой рекурсивный алгоритм в нерекурсивный, но логика часто намного сложнее, и для этого требуется использование стека.
Фактически, сама рекурсия использует стек: стек функций. Поведение в виде стека можно увидеть в следующем примере:
function foo (i) {
если (я <0)
возвращаться;
console.log ('начало:' + я);
foo (я - 1);
console.log ('конец:' + я);
}
foo (3);
Вложенные функции и замыкания
Вы можете вложить функцию в другую функцию. Вложенная (внутренняя) функция является частной для своей содержащей (внешней) функции.
Он также образует крышку .Замыкание - это выражение (чаще всего функция), которое может иметь свободные переменные вместе со средой, которая связывает эти переменные (которая «закрывает» выражение).
Поскольку вложенная функция является замыканием, это означает, что вложенная функция может «наследовать» аргументы и переменные содержащейся в ней функции. Другими словами, внутренняя функция содержит область действия внешней функции.
Суммируем:
- Доступ к внутренней функции можно получить только из операторов внешней функции.
- Внутренняя функция образует замыкание: внутренняя функция может использовать аргументы и переменные внешней функции, в то время как внешняя функция не может использовать аргументы и переменные внутренней функции.
В следующем примере показаны вложенные функции:
function addSquares (a, b) {
function square (x) {
вернуть х * х;
}
вернуть квадрат (а) + квадрат (б);
}
а = addSquares (2, 3);
b = addSquares (3, 4);
c = addSquares (4, 5);
Поскольку внутренняя функция образует замыкание, вы можете вызвать внешнюю функцию и указать аргументы как для внешней, так и для внутренней функции:
функция снаружи (х) {
функция внутри (y) {
вернуть x + y;
}
вернуться внутрь;
}
fn_inside = снаружи (3);
результат = fn_inside (5);
результат1 = снаружи (3) (5);
Сохранение переменных
Обратите внимание, как x
сохраняется, когда возвращается внутри
. Замыкание должно сохранять аргументы и переменные во всех областях, на которые оно ссылается. Поскольку каждый вызов предоставляет потенциально разные аргументы, для каждого вызова за пределами
создается новое закрытие. Память может быть освобождена только тогда, когда возвращенный внутри
больше не доступен.
Это не отличается от хранения ссылок в других объектах, но часто менее очевидно, поскольку ссылки не устанавливаются напрямую и не могут быть проверены.
Множественно-вложенные функции
Функции могут быть множественно-вложенными.Например:
- Функция (
A
) содержит функцию (B
), которая сама содержит функцию (C
). - Обе функции
B
иC
образуют здесь закрытие. Итак,B
может получить доступ кA
, аC
может получить доступ кB
. - Кроме того, поскольку
C
может получить доступ кB
, который может получить доступ кA
,C
также может получить доступ кA
.
Таким образом, укупорочные средства могут содержать несколько областей видимости; они рекурсивно содержат объем функций, содержащих его.Это называется цепочкой областей видимости . (Причина, по которой это называется «сцеплением», объясняется позже.)
Рассмотрим следующий пример:
функция A (x) {
функция B (y) {
функция C (z) {
console.log (x + y + z);
}
С (3);
}
БИ 2);
}
А (1);
В этом примере C
обращается к B
y
и A
x
.
Это можно сделать, потому что:
-
B
образует укупорочное средство, включаяA
(т.е.е.B
может получить доступ к аргументам и переменнымA
). -
C
образует укупорочное средство, включаяB
. - Поскольку закрытие
B
включаетA
, закрытиеC
включаетA
,C
может получить доступ к какB,
, иA,
аргументы и переменные. Другими словами,C
связывают с областямиB
иA
, в таком порядке .
Обратное, однако, неверно. A
не может получить доступ к C
, потому что A
не может получить доступ ни к одному аргументу или переменной B
, переменной которой является C
. Таким образом, C
остается частным только для B
.
Конфликты имен
Когда два аргумента или переменных в области действия закрытия имеют одно и то же имя, возникает конфликт имен . Более вложенные области имеют приоритет. Таким образом, самая внутренняя область видимости имеет наивысший приоритет, а самая внешняя область - наименьший.Это цепочка областей видимости. Первая в цепочке - это самая внутренняя область видимости, а последняя - самая внешняя. Рассмотрим следующее:
функция за пределами () {
var x = 5;
function inside (x) {
вернуть x * 2;
}
вернуться внутрь;
}
снаружи () (10);
Конфликт имен возникает в заявлении return x
и находится между внутри параметра
x
и вне переменной
x
. Цепочка областей видимости здесь: { внутри
, вне
, глобальный объект}.Следовательно, внутри
x
имеет приоритет над вне
x
, и возвращается 20
( внутри
x
) вместо 10
( вне
). х
).
Замыкания - одна из самых мощных функций JavaScript. JavaScript позволяет вложение функций и предоставляет внутренней функции полный доступ ко всем переменным и функциям, определенным внутри внешней функции (и ко всем другим переменным и функциям, к которым внешняя функция имеет доступ).
Однако внешняя функция не имеет доступа и к переменным и функциям, определенным внутри внутренней функции. Это обеспечивает своего рода инкапсуляцию для переменных внутренней функции.
Кроме того, поскольку внутренняя функция имеет доступ к области действия внешней функции, переменные и функции, определенные во внешней функции, будут жить дольше, чем продолжительность выполнения внешней функции, если внутренней функции удастся выжить после срока службы внешняя функция.Замыкание создается, когда внутренняя функция каким-то образом становится доступной для любой области вне внешней функции.
var pet = function (name) {
var getName = function () {
возвращаемое имя;
}
return getName;
}
myPet = pet ('Виви');
мой питомец();
Это может быть намного сложнее, чем приведенный выше код. Может быть возвращен объект, содержащий методы для управления внутренними переменными внешней функции.
var createPet = function (name) {
var sex;
возвращаться {
setName: function (newName) {
name = newName;
},
getName: function () {
возвращаемое имя;
},
getSex: function () {
ответный секс;
},
setSex: function (newSex) {
if (typeof newSex === 'строка' && (newSex.toLowerCase () === 'мужской' ||
newSex.toLowerCase () === 'female')) {
секс = newSex;
}
}
}
}
var pet = createPet ('Виви');
pet.getName ();
домашний питомец.setName ('Оливер');
pet.setSex ('мужчина');
pet.getSex ();
pet.getName ();
В приведенном выше коде переменная name
внешней функции доступна для внутренних функций, и нет другого способа получить доступ к внутренним переменным, кроме как через внутренние функции. Внутренние переменные внутренних функций действуют как безопасные хранилища для внешних аргументов и переменных. Они содержат «постоянные» и «инкапсулированные» данные, с которыми могут работать внутренние функции. Функции даже не обязательно должны быть присвоены переменной или иметь имя.
var getCode = (function () {
var apiCode = '0] Eal (eh & 2';
return function () {
return apiCode;
};
}) ();
получить код();
Осторожно: При использовании закрытий необходимо остерегаться ряда подводных камней!
Если закрытая функция определяет переменную с тем же именем, что и переменная во внешней области видимости, то нет возможности снова обратиться к переменной во внешней области.(Переменная внутренней области видимости "переопределяет" внешнюю, пока программа не выйдет из внутренней области видимости.)
var createPet = function (name) {
возвращаться {
setName: function (name) {
name = name;
}
}
}
Аргументы функции хранятся в объекте, подобном массиву. Внутри функции вы можете адресовать переданные ей аргументы следующим образом:
аргументы [i]
, где i
- порядковый номер аргумента, начиная с 0
.Итак, первым аргументом, переданным функции, будет arguments [0]
. Общее количество аргументов указано аргументами. Длина
.
Используя объект arguments
, вы можете вызвать функцию с большим количеством аргументов, чем официально объявлено для принятия. Это часто бывает полезно, если вы заранее не знаете, сколько аргументов будет передано функции. Вы можете использовать arguments.length
, чтобы определить количество аргументов, фактически переданных функции, а затем получить доступ к каждому аргументу с помощью объекта arguments
.
Например, рассмотрим функцию, которая объединяет несколько строк. Единственным формальным аргументом функции является строка, в которой указаны символы, разделяющие элементы для объединения. Функция определяется следующим образом:
функция myConcat (разделитель) {
var result = '';
var i;
for (i = 1; i length; i ++) {
результат + = аргументы [i] + разделитель;
}
вернуть результат;
}
Этой функции можно передать любое количество аргументов, и она объединит каждый аргумент в строку «список»:
myConcat (',', 'красный', 'оранжевый', 'синий');
myConcat (';', 'слон', 'жираф', 'лев', 'гепард');
myConcat ('.',' шалфей ',' базилик ',' душица ',' перец ',' петрушка ');
Примечание: Переменная arguments
«подобна массиву», но не массиву. Он похож на массив в том смысле, что имеет пронумерованный индекс и свойство длины . Однако не обладает всеми методами манипулирования массивами.
См. Объект Function
в справке по JavaScript для получения дополнительной информации.
Начиная с ECMAScript 2015, есть два новых типа параметров: параметров по умолчанию и остальных параметров .
Параметры по умолчанию
В JavaScript параметры функций по умолчанию undefined
. Однако в некоторых ситуациях может быть полезно установить другое значение по умолчанию. Именно это и делают параметры по умолчанию.
Без параметров по умолчанию (до ECMAScript 2015)
В прошлом общая стратегия установки значений по умолчанию заключалась в проверке значений параметров в теле функции и присвоении значения, если они равны undefined
.
В следующем примере, если для b
не указано значение, его значение будет undefined
при вычислении a * b
, а вызов умножить
обычно вернул бы NaN
.Однако этому препятствует вторая строка в этом примере:
.
функция multiply (a, b) {
b = typeof b! == 'undefined'? б: 1;
вернуть a * b;
}
умножить (5);
С параметрами по умолчанию (после ECMAScript 2015)
С параметрами по умолчанию ручная проверка в теле функции больше не требуется. Вы можете указать 1
в качестве значения по умолчанию для b
в заголовке функции:
функция умножения (a, b = 1) {
вернуть a * b;
}
умножить (5);
Подробнее см. Параметры по умолчанию в справочнике.
Остальные параметры
Синтаксис остальных параметров позволяет нам представить неопределенное количество аргументов в виде массива.
В следующем примере функция умножить
использует остальных параметров для сбора аргументов от второго до конца. Затем функция умножает их на первый аргумент.
функция multiply (multiplier, ... theArgs) {
вернуть theArgs.map (x => multiplier * x);
}
var arr = multiply (2, 1, 2, 3);
консоль.журнал (обр);
Выражение стрелочной функции (ранее, а теперь ошибочно известное как жирная стрелочная функция ) имеет более короткий синтаксис по сравнению с функциональными выражениями и не имеет собственного this
, arguments, super или new.target. Стрелочные функции всегда анонимны. См. Также сообщение в блоге hacks.mozilla.org: «Подробное описание ES6: стрелочные функции».
На введение стрелочных функций повлияли два фактора: более короткие функции и необязательные из это
.
Более короткие функции
В некоторых функциональных шаблонах приветствуются более короткие функции. Сравнить:
var a = [
«Водород»,
'Гелий',
"Литий",
'Бериллий'
];
var a2 = a.map (функция (и) {return s.length;});
console.log (a2);
var a3 = a.map (s => s.length);
console.log (a3);
Нет отдельного
this
До стрелочных функций каждая новая функция определяла свое собственное значение this
(новый объект в случае конструктора, не определен в вызовах функций в строгом режиме, базовый объект, если функция вызывается как «объектный метод» и т. д.). Это оказалось далеко не идеальным для объектно-ориентированного стиля программирования.
function Person () {
this.age = 0;
setInterval (function growUp () {
this.age ++;
}, 1000);
}
var p = новый человек ();
В ECMAScript 3/5 эта проблема была исправлена путем присвоения значения в и
переменной, которую можно было закрыть.
function Person () {
var self = this;
self.age = 0;
setInterval (function growUp () {
себя.age ++;
}, 1000);
}
В качестве альтернативы может быть создана связанная функция, чтобы правильное значение и это значение
передавалось в функцию growUp ()
.
Стрелочная функция не имеет своей собственной this;
- - используется значение
окружающего контекста выполнения. Таким образом, в следующем коде , это
в функции, которая передается в setInterval
, имеет то же значение, что и , это
во включающей функции:
function Person () {
это.возраст = 0;
setInterval (() => {
this.age ++;
}, 1000);
}
var p = новый человек ();
JavaScript имеет несколько встроенных функций верхнего уровня:
-
eval ()
Метод
eval ()
оценивает код JavaScript, представленный в виде строки.-
неравномерное ()
Метод
uneval ()
создает строковое представление исходного кода объектаObject
.-
isFinite ()
Глобальная функция
isFinite ()
определяет, является ли переданное значение конечным числом. При необходимости параметр сначала преобразуется в число.-
isNaN ()
Функция
isNaN ()
определяет, является ли значениеNaN
или нет. Примечание: принуждение внутри функцииisNaN
имеет интересные правила; Вы также можете использовать номер.isNaN ()
, как определено в ECMAScript 2015, или вы можете использоватьtypeof
, чтобы определить, является ли значение Not-A-Number.-
parseFloat ()
Функция
parseFloat ()
анализирует строковый аргумент и возвращает число с плавающей запятой.-
parseInt ()
Функция
parseInt ()
анализирует строковый аргумент и возвращает целое число указанного основания (основание в математических системах счисления).-
decodeURI ()
Функция
decodeURI ()
декодирует унифицированный идентификатор ресурса (URI), ранее созданныйencodeURI
или аналогичной программой.-
decodeURIComponent ()
Метод
decodeURIComponent ()
декодирует компонент унифицированного идентификатора ресурса (URI), ранее созданныйencodeURIComponent
или аналогичной процедурой.-
encodeURI ()
Метод
encodeURI ()
кодирует унифицированный идентификатор ресурса (URI), заменяя каждый экземпляр определенных символов одной, двумя, тремя или четырьмя escape-последовательностями, представляющими кодировку символа UTF-8 (будет только четыре escape-последовательности для символов, состоящих из двух «суррогатных» символов).-
encodeURIComponent ()
Метод
encodeURIComponent ()
кодирует компонент унифицированного идентификатора ресурса (URI), заменяя каждый экземпляр определенных символов одной, двумя, тремя или четырьмя escape-последовательностями, представляющими кодировку символа UTF-8 (будет только четыре escape-последовательности для символов, состоящих из двух «суррогатных» символов).-
побег ()
Устаревший метод
escape ()
вычисляет новую строку, в которой определенные символы были заменены шестнадцатеричной escape-последовательностью. Вместо этого используйтеencodeURI
илиencodeURIComponent
.-
unescape ()
Устаревший метод
unescape ()
вычисляет новую строку, в которой шестнадцатеричные escape-последовательности заменяются символом, который она представляет.Управляющие последовательности могут быть введены функцией типаescape
. Посколькуunescape ()
устарел, используйте вместо негоdecodeURI ()
илиdecodeURIComponent
.
Использование функций для решения сложных проблем JavaScript - JavaScript 101
JavaScript 101 - это серия обучающих видеороликов, предоставленных инструкторами по веб-разработке DevMountain. Щелкните здесь, чтобы просмотреть всю серию видео.
Вы можете написать свои собственные функции или использовать заранее написанный набор функций в библиотеке кода вашего языка программирования для выполнения специализированных задач.Создание этих функций - это одно, но вам нужно усвоить идею, что вы можете объединить несколько шагов программирования в одно действие, если вы правильно запрограммируете свои функции. В этом видео вы узнаете, как использовать функции для решения сложных задач JavaScript.
Транскрипция видео
JavaScript предоставляет функции, аналогичные большинству языков сценариев и программирования. Функции - один из основных строительных блоков JavaScript.В частности, в JavaScript функция позволяет вам определять блок кода, давать ему имя и затем выполнять его столько раз, сколько вы хотите.
Функции - это «подпрограмма», которая может быть вызвана кодом, внешним (или внутренним в случае рекурсии) по отношению к функции. Это первоклассные объекты, потому что у них есть свойства и методы, как и у любого другого объекта. Что отличает их от других объектов, так это возможность вызова функций.
Когда вы создаете функцию, она может содержать любое количество кода и любой тип кода.Вы можете создавать переменные, изменять переменные, выполнять логические сравнения с условными выражениями и любое количество других задач, содержащихся в одной функции. Создание функций - это одно, но совершенно другой навык, который нам нужно освоить, - это идея, что мы можем объединить несколько шагов программирования в одно действие, если мы правильно программируем наши функции.
Например, может показаться простым создание функции, которая складывает числа вместе, потому что это всего лишь одно действие. Но функции могут быть намного более мощными, если вы думаете о них как о чем-то, что содержит любое повторяемое количество шагов.Вспомните наше обсуждение вычислительного мышления. Часть программирования означает создание алгоритмов, использующих повторяющиеся шаги. Поэтому не ограничивайте то, что, по вашему мнению, могут делать функции, думая, что они могут делать только одну вещь. Функция может запускать одну строку кода, например сложение двух чисел вместе или сотни строк кода, например поиск тысяч записей в базе данных и поиск одного элемента. Все, независимо от того, как долго, может содержаться в функции.
Гибкость функций
Кроме того, гибкость, которую обеспечивают функции нашего кода, означает, что нам нужно отслеживать, куда передаются данные.Например, если бы мне пришлось создать функцию для подсчета определенной переменной, тогда моей функции вообще не потребовалось бы передавать какие-либо данные. Моя функция просто подсчитывала бы эту переменную. Но если бы я хотел создать более гибкую функцию, которая добавляла бы единицу к любому числу или к любой переменной, тогда мне понадобился бы способ сообщить этой функции, какой переменной нужно манипулировать. Таким образом, я могу выбрать, какую переменную нужно изменить, выбрав то, что передается в функцию.
Какие параметры?
Функции используют механизм ввода, чтобы определить, какие данные будут переданы этой функции.Это так называемые параметры. Мы обсуждали их раньше, но они являются секретным оружием для функций, которое отличает жесткие функции от более мощных и гибких действий, которые может выполнять ваш код.
Использование параметров для создания гибкой функции
Давайте вернемся к приложению для обмена сообщениями, чтобы показать, что я имею в виду, говоря об использовании параметров для создания гибкой функции. Допустим, каждый раз, когда кто-то нажимает кнопку «Отправить», вы хотите выполнить функцию, которая будет отображать введенные слова на экране.Мы не можем этого сделать, не передав данные в функцию. Это потому, что мы не хотим, чтобы функция отправляла заданный ответ. Мы хотим, чтобы он отправлял все, что вводит пользователь. И поэтому нам нужно каким-то образом передать эти данные в функцию. Мы делаем это с помощью параметров. Обратные вызовы - это шаблон. Это не синтаксис. Когда мы отправляем параметры в функцию, мы можем отправить другую функцию вместо числа, строки или другого простого типа данных. Это позволяет принимающей функции вызывать функцию, которую мы передали, когда это необходимо.
Мы делаем это в реальной жизни, когда даем кому-то номер телефона. Скажем, я использую Стива, чтобы помочь мне выполнить задачу A, а Дэйв помогает мне выполнить задачу B. Стив и Дэйв - это функции, которые я вызываю, вызывая их на их телефоны. Что, если я дам Стиву номер Дэйва? Когда Стив позвонит Дэйву? Я не знаю. И это не важно. Стив теперь контролирует, когда вызывать Дэйва за помощью.
Обычно это применяется в нашем коде для обработки событий щелчка.Мы не знаем, когда пользователь нажмет кнопку. Таким образом, мы даем механизму JavaScript функцию, которую он может использовать для помощи при нажатии кнопки. Мы не запускаем функцию. Создаем инструкции и передаем их. Мы рассмотрим это подробнее в следующих видео по синтаксису.
Многополюсные функции
Давайте поговорим о многострочных функциях или функциях, которые делают за нас несколько вещей. Функции - это один из строительных блоков JavaScript. И они могут быть такими мощными.Они могут делать для нас очень много разных вещей. Итак, я собираюсь представить многострочные функции или функции, которые выполняют несколько задач.
Многополюсные функции - Практика I
Давайте посмотрим на редактор кода. В редакторе кода я собираюсь создать функцию, называемую составителем предложений. И в фигурных скобках для составителя предложений первое, что я собираюсь сделать, это создать переменную. Я назову это первой частью. Это будет первая часть предложения. Я использую let.Позвольте вариации на var. По сути, он делает то же самое. Есть небольшие вариации. Но мы можем использовать let почти так же, как и var. Итак, позвольте, первая часть. В значении, которое я сохраняю в переменной, первая часть будет «Я - начальная запятая и небольшой пробел». А потом я собираюсь заняться и другими вещами в этой функции. Я скажу этой функции, второе, что вы собираетесь сделать, это создать другую переменную, называемую второй частью. И ценность, которую я собираюсь хранить там, будет, и я буду концом предложения, восклицательным знаком.И последнее, что я хочу, чтобы эта функция делала, - это возвращала первую часть. Я воспользуюсь плюсом. Плюс - это оператор, объединяющий эти два предложения вместе. Итак, первая часть плюс вторая часть вернут одну строку, которая должна быть: «Я - начало запятой, а я - конец предложения».
Давайте посмотрим, что у нас получилось. Я собираюсь начать Quokka на этом валу. Quokka - это расширение кода VS, которое поможет мне взглянуть на некоторые значения переменных в моем файле.Просто очень полезно увидеть, что происходит в файле. Итак, я собираюсь создать переменную с именем результат или, что более уместно, полное предложение. И то, что я собираюсь хранить там, - это результат вызова генератора предложений. Скобки составителя предложения. Хорошо. Я наберу имя переменной для предложения, и Quokka скажет мне, какое значение хранится в полном предложении. Я начало и конец предложения. Итак, я использовал здесь многострочную функцию, чтобы иметь возможность создать функцию, которая выполняет несколько задач, а затем возвращает для нас окончательное значение.
Многополюсные функции - Практика II
Давайте посмотрим на другой пример. Функция. Назовем этого создателя мечты, потому что он создаст для нас мечту или желание. Посмотрим здесь. Эта функция сначала сработает ... Давайте начнем с числа. Так что позвольте num. И я скажу 50. И затем я переопределю значение num, сначала сославшись на имя переменной. Num. И я собираюсь использовать знак равенства в качестве оператора, чтобы переопределить его значение, и скажу, что новое значение для num будет num, которое в настоящее время равно 50 умноженным на два.Итак, новое значение для num должно быть 100. И последнее, что я собираюсь сделать, это вернуть строку. Я хочу жить до тех пор, пока не доживу до этого момента, а затем я собираюсь вычислить это число. И я просто поставлю число. Так что это должно дать нам ценность. Я хочу дожить до 100 лет. Посмотрим, есть ли. Я скажу, пусть результат равен призыву создателя мечты. И давайте Quokka расскажет нам, что сейчас хранится в результате. Я хочу дожить до 100 лет.
Итак, это было всего лишь быстрое погружение в многострочные функции.Функции могут сделать за нас очень многое. Так что поймите это. Поймите, что вы можете указать функциям выполнять несколько задач. Он может делать что-то одно или 50 отдельных дел. Это зависит от вас и вашего воображения, а также от того, что вам нужно, чтобы ваша функция выполняла для вашей программы.
Динамические функции в JavaScript
Давайте поговорим о создании динамических функций в JavaScript. Вы будете создавать много разных функций. И функции, которые вы создаете, вероятно, будут предназначены для выполнения очень конкретной задачи.Но мы хотим иметь возможность создавать динамические функции. Функции, которые могут быть вызваны и могут выполнять определенную задачу, но на основе определенной информации, которая передается в функцию. Функции могут иметь входы и выходы. Мы обсудили выходные данные или то, что функция может выводить с помощью операторов возврата. И давайте немного поговорим о том, как сделать наши функции более динамичными, обсудив, какие входные данные мы можем дать функции.
Динамические функции - Практика I
Давайте посмотрим на редактор кода.И давайте создадим функцию. Я назову эту функцию приветствием. Теперь эта функция делает одно. Он вернет строку. Он скажет "привет, Джо". И что я собираюсь сделать, так это зафиксировать результаты. Я скажу, пусть результат. И я призываю приветствовать.
Хорошо. Итак, как я уже сказал, у функций есть входы и выходы. Поэтому, когда я вызываю приветствие, выводом этой функции является строка hello Joe. Он возвращает это значение. Это его результат. И этот вывод сохраняется в результате.Я покажу вам это, запустив Quokka. Quokka - это просто плагин VS-кода, который помогает нам понять некоторые значения наших переменных в этом файле. Так что, если я напечатаю здесь имя переменной, он скажет мне, что хранится внутри этой переменной. Привет, Джо. Хорошо. Итак, у нас есть строка hello, Joe, которая сохраняется в result. Независимо от того, сколько раз вызывать приветствие. Давай сделаем это снова. Пусть приведут два равных приветствия. Вызывается снова. И давайте посмотрим на значение результата два. Независимо от того, сколько раз я вызываю это, я каждый раз буду здороваться с Джо.
Эта функция не очень динамичная. Итак, чтобы сделать эту функцию более динамичной, мы должны иметь возможность принимать какие-то входные данные в эту функцию. И я покажу вам, как это сделать. Итак, я избавлюсь от этого второго вызова и получу второй результат. Хорошо. Если бы я хотел передать часть информации в эту функцию, что мы можем сделать. Мы можем дать ему вход. Я сделаю это здесь. Когда я вызываю приветствие, я собираюсь между этими скобками помещать сюда часть информации.И я передам приветствие конкретным именем. Я просто передам это на свое имя. Теперь я передаю строку, Джо. И эта строка здесь, все, что я вставил между этими скобками, называется аргументом. Хорошо? Это аргумент функции.
И для того, чтобы зафиксировать это значение, которое передается в функцию, мне нужен параметр. Параметры помещаются в круглые скобки в определении функции. Так как я передаю имя, я назову этот параметр именем.Я могу назвать параметр как угодно. Неважно, что это такое, но вы должны назвать это как-нибудь, соответствующее типу данных, которые передаются в функцию. Итак, я передаю строку Джо. И я улавливаю эту ценность. Или это значение сохраняется в этом имени параметра. Теперь с параметрами можно обращаться как с локальными переменными в функции. Так что вместо жесткого программирования здесь Джо. На самом деле я собираюсь добавить имя в конец этой строки. А теперь взгляните на то, что нам здесь показывает Quokka.Внутри этой переменной результата мы все еще получаем привет, Джо. Это тот же самый результат. Только на этот раз Джо не было на мероприятии. С самого начала это не было частью этой строки. Мы передали эту информацию в качестве входных данных для этой функции.
Итак, мы сделали эту функцию более динамичной, используя этот аргумент, строку Joe, и передав ее в эту функцию в качестве входных данных. И мы фиксируем это значение с помощью параметра. Параметры помещаются между скобками и определением функции.И затем мы можем использовать этот параметр, как любую другую переменную внутри этой функции. Итак, теперь мы возвращаем строку hello и объединяем эту переменную со строкой здесь.
Вы можете это увидеть ... Но ценность результата. Квокка говорит нам, что значение результата по-прежнему привет, Джо. Хотя мы больше не жестко кодируем строку hello comma, Джо. Итак, теперь мы фактически принимаем участие. Но самое замечательное в том, что мы изменили, даже несмотря на то, что мы получаем тот же самый точный результат прямо сейчас, это то, что мы сделали эту функцию динамической, используя аргументы и параметры или используя входные данные.
Если бы я ... Скажу, пусть результат два. Я снова вызову приветствие. Только на этот раз я передам строку Ник. Давайте посмотрим на значение результата два. На этот раз результат два дает нам значение Hello Nick. И снова, еще раз, если я захочу сделать это еще раз, пусть результат три одинаковых приветствия и переход в Грега. И теперь значение результата три - привет, Грег. Хорошо? Итак, мы принимаем ввод, а функция возвращает другую строку на основе этого ввода.Основываясь на аргументе, который мы в него вошли.
Динамические функции - Практика II
Позвольте мне показать вам еще один пример, где мы собираемся немного поработать с математикой. Итак, я собираюсь создать функцию под названием multiply. И эта функция фактически принимает две части информации. Итак, я собираюсь ввести здесь два параметра. Num one comma num two. Итак, вы разделите каждый параметр запятой. А потом фигурные скобки. И я хочу, чтобы эта функция ... Она должна принимать два числа.Входными данными будут значения номер один и два. И затем он вернется или выдаст результат num one умножить на два. Хорошо. Теперь, когда я вызываю эту функцию ... Скажите let result, и я буду вызывать умножение. И что я собираюсь здесь сделать, так это передать два аргумента. У меня два параметра. Я могу передать здесь две части информации. Так что я поставлю три запятые и пять. Как и параметры, аргументы разделяются запятыми.
Давайте посмотрим, что это за результат.Quokka скажет нам, что результат 15. Итак, я сдал три. Этот первый аргумент передается в этот первый параметр, номер один. И второй аргумент ко второму параметру. И у вас может быть столько аргументов и параметров, сколько вы хотите. Если бы я хотел иметь третий, четвертый и пятый параметр ... Или извините. Третий, четвертый и пятый аргумент, мне нужно было бы иметь третий, четвертый и пятый параметр, чтобы иметь возможность поймать это входящее значение. Хорошо? Но в этом случае у нас как раз два аргумента.Итак, нам нужны два параметра. Я беру эти два входа, третий и пятый. Захват их в количестве один, два. А затем умножаем их вместе и возвращаем результат. И результат 15.
Итак, это введение во входные и выходные данные с использованием аргументов и параметров и последующим возвратом значений вне функции для создания более динамических функций в JavaScript.
Бывают моменты, когда вы хотите, чтобы какая-то функция вызывалась или выполняла какую-то задачу, когда происходит какое-то событие.Например, когда какой-то пользователь нажимает кнопку в вашем приложении, вы можете захотеть запустить некоторую функцию. Я покажу вам, как это сделать. Давайте посмотрим на этот HTML-файл.
Итак, сейчас между открывающим и закрывающим тегами тела ничего нет. Я собираюсь это изменить. Я собираюсь добавить кнопку. И между тегами кнопок я помещу отправить. Здесь, в окне браузера, вы можете увидеть нашу кнопку отправки. Прямо сейчас я могу щелкнуть по нему, но он ничего не делает, но давайте это изменим.Чтобы это изменить, нам понадобится немного JavaScript. Я собираюсь добавить теги сценария в конец ... Или прямо перед закрывающим тегом тела. Если я хочу ввести действительный код JavaScript, я могу ввести здесь любой допустимый код JavaScript между тегами сценария. Хорошо?
Итак, первое, что я хочу сделать, чтобы запустить какую-либо функцию при щелчке по этому элементу, - мне нужно использовать JavaScript для фактического выбора этого элемента. Я сделаю это следующим образом.Пусть кнопке отправки будет присвоено значение document.getElementById. А потом я его вызову. Хорошо. Так что это немного похоже на английский. Document.getElementById. Пытаюсь выделить какой-то элемент по его идентификатору. Поэтому для этого мне действительно нужен уникальный идентификатор элемента, который я хочу выбрать на моей кнопке отправки. Итак, я подойду к кнопке и добавлю атрибут ID. И это будет уникальный идентификатор. И значение этого идентификатора будет представлять собой тире BTN.Хорошо. А теперь вернемся к нашему JavaScript. Document.getElementById. Если я хотел получить какой-либо элемент по идентификатору или выбрать какой-либо элемент по идентификатору, мне действительно нужно передать идентификатор в качестве аргумента. Итак, я говорю, чтобы он получил элемент с идентификатором submit dash BTN.
Хорошо. Теперь у меня есть эта переменная. Отправить кнопку. И это у меня есть, потому что результатом Document.getElementById будет ссылка на выбранный элемент. Наша кнопка отправки. Итак, теперь, когда я выбрал нашу кнопку отправки, я собираюсь сослаться на переменную здесь, в строке 14.Отправить кнопку. И я собираюсь добавить прослушиватель событий. И я собираюсь его вызвать. Хорошо. В JavaScript, когда мы используем прослушиватель событий add, есть много разных событий, которые мы действительно можем прослушивать. Мы специально просто собираемся узнать об использовании ... Мы слушаем событие щелчка.
Второй аргумент сразу после щелчка строки будет функцией. Теперь то, что у нас есть, находится на нашей кнопке отправки, когда происходит щелчок, эта функция будет вызвана.И я добавлю сюда предупреждение. Оповещение - это встроенная функция в JavaScript. Появится небольшое окно с предупреждением о любом сообщении, которое мы поместили в круглые скобки. Так что я просто отправлю представленные. Хорошо. Я могу поместить в эту функцию практически все, что захочу. Функции могут быть очень динамичными. Но я просто предпочитаю сделать эту единственную отправленную строку. Просто чтобы мы могли проверить, работает ли это. Я подойду к окну браузера и нажму кнопку «Отправить». И всплывает наше окно с предупреждением и говорит, что отправлено.Идеально. Работает.
Давайте продолжим и подведем итоги еще раз. Итак, что имеем. Первое, что мы сделали, это использовали метод Document.getElementById, чтобы иметь возможность выбирать элемент по его идентификатору. Итак, эта строка должна соответствовать некоторому идентификатору. И он соответствует нашему ID на нашем кнопочном элементе прямо здесь. В переменной кнопки отправки мы сохранили ссылку на нашу кнопку отправки. И мы ссылаемся на эту переменную и вызываем прослушиватель событий добавления. Мы специально прислушиваемся к тому, когда происходит событие щелчка на этом элементе кнопки.И когда происходит это событие щелчка, вызывается следующая функция.
Динамические функции - Практика III
Давайте продолжим и сделаем еще один пример. Я добавлю еще одну кнопку. И я знаю, что собираюсь ... Я назову это своей кнопкой отмены. Но я знаю, что собираюсь выбрать эту кнопку, используя некоторый JavaScript. Итак, я добавлю уникальный идентификатор. И значение этого ID будет отменено тире BTN. Теперь под другим нашим JavaScript я буду следовать тому же самому шаблону.Первое, что мне нужно сделать, это выбрать этот элемент, чтобы я мог слышать щелчок по нему. Итак, пусть кнопке отмены будет присвоено значение Document.getElementById. Я вызываю этот метод. Затем я помещаю идентификатор элемента, который хочу выделить, между круглыми скобками. Отменить тире BTN. Теперь, когда я правильно выбрал элемент, я могу прослушивать событие щелчка. Кнопка отмены в качестве ссылки на переменную в строке чуть выше точки добавления прослушивателя событий. И я призываю его. И первый аргумент, который мы передаем, - это щелчок по кавычкам.Мы прислушиваемся к каждому щелчку по нашей кнопке отмены. Функция запятой в качестве второго аргумента. Таким образом, эта функция будет вызываться всякий раз, когда будет нажата наша кнопка отмены. И я сделаю нечто подобное. Предупреждение с надписью "Отменено".
Хорошо. Итак, у нас есть две кнопки. И наши две кнопки, всякий раз, когда на них нажимают, они должны активироваться ... Должны быть вызваны две отдельные функции. Одно оповещение отправлено, а второе отменено. Давайте продолжим и проверим, что это происходит.Нажмите на «Отправить», и мы будем представлены. Нажмите на отмену, и мы будем отменены. Так что это один из способов обработки события щелчка всякий раз, когда мы нажимаем кнопку и вызываем функцию.
[cta vid = "0"]
Дополнительная литература
Введение в объекты - JavaScript 101
Введение в условные выражения - JavaScript 101
Введение в операторов - JavaScript 101
функций JavaScript, объясненных путем создания рецепта [Интерактивное объяснение]
Если вы когда-либо готовили по рецепту, вы можете понять функции в JavaScript
Функции - одна из ключевых частей любого языка программирования.Но если JavaScript - ваш первый язык, все же может потребоваться немного усилий, чтобы привыкнуть к их синтаксису и различным возможным входам и выходам.
Как вы, возможно, уже знаете, сайт CodeAnalogies посвящен обучению веб-разработке с использованием аналогий. Но есть одна общая аналогия, которую каждый использует для функций: рецепты из поваренной книги!
Итак, я собираюсь продолжить эту аналогию и использовать пару интерактивных диаграмм, чтобы сделать каждую часть как можно более ясной.
Чтобы понять это руководство, вам сначала нужно понять переменные в JavaScript. Ознакомьтесь с моим руководством по переменным здесь, если вам нужно.
Что такое функция?
Давайте сначала подумаем об общей концепции приготовления по рецепту. Использование рецепта означает, что:
- Вы начинаете с определенного набора ингредиентов
- Вы выполняете определенную процедуру с использованием этих ингредиентов
- По итогу получите надежный товар
Функция - это также рецепт многократного использования, который многократно выполняет один и тот же набор действий с набором ингредиентов.
Эти ингредиенты называются параметрами . Вы можете увидеть их на схеме ниже.
Некоторые функции возвращают значение. Это означает, что они дают вам новое значение, которое вы затем можете использовать в своем скрипте. Другие функции не возвращают значение. Вместо этого они могут изменить значение, которое уже существует в вашем скрипте. Думайте об этом как о нарезке лука. Нет никакого «нового» продукта, просто такой же продукт в новом формате.
Посмотрите на пример ниже, чтобы увидеть общий вид функции.В этом примере мы объявляем функцией makeSandwich. Он действительно возвращает значение - полный бутерброд. Другими словами, мы документируем рецепт приготовления бутерброда.
Пример 1 - Кипящая вода
Давайте перейдем к первому примеру. Допустим, вы пытаетесь написать функцию для кипячения воды. В этом примере мы начнем с пасты, воды и кастрюли. Поскольку на самом деле мы не создаем ничего нового, в этом не будет возвращаемого значения.Вот как выглядит функция.
Итак, чтобы предложение имело смысл, параметры вода, и горшок должны быть числами, а параметр паста должен быть строкой.
Теперь у нас есть рецепт кипятка. Я знаю, что это новаторские вещи. Но у нас только заявили о функции. Теперь нам нужно позвонить по номеру по номеру , чтобы вода закипела. Это другое обозначение. Он строго использует имя функции.
Вот полный пример. Мы собираемся сварить спагетти в 30 унций воды в кастрюле на 120 унций. Наведите или нажмите на каждую часть функции, чтобы узнать больше о каждой части.
Поскольку в последней строке мы вызываем функцию boilWater, вы хотите начать чтение оттуда, чтобы узнать, какие значения будут переданы в функцию. Окончательный результат:
«Мы собираемся вскипятить 30 унций воды со спагетти в кастрюле на 120 унций»
Одно небольшое примечание.Вы заметили, что мы ввели здесь новый термин? Мы ввели аргумент . Аргумент - это значение, которое используется, когда мы вызываем функцию .
В этом разница - эти три параметра не подлежат обсуждению. Вода. Макароны. Горшок. Но объем воды? Тип макарон? Размер горшка? Вы можете их изменить. Это аргументы.
Пример 2 - Приготовление бутерброда
В отличие от рецепта boilWater, многие функции имеют значение , возвращающее значение .Это означает, что они выводят одно значение, массив, объект или другую функцию. Они не просто изменяют переменные, которые уже существуют в вашем скрипте.
Мы собираемся создать функцию makeSandiwch, которая будет принимать три параметра - мясо, овощ и хлеб. Будет выведен готовый бутерброд. Каждый должен быть строкой. Довольно просто. Вот эта функция.
При выполнении этой функции мы собираемся сделать две вещи иначе, чем в примере с boilWater.Во-первых, нам нужна новая переменная для хранения последнего бутерброда, который у нас есть после строки возврата. Мы назовем эту ветчину Сэндвич (есть подсказка насчет ингредиентов)
Но, когда мы вызываем функцию, мы собираемся использовать переменные в качестве аргументов . В boilWater мы напрямую вводили значения при вызове функции. Мы собираемся использовать переменные, чтобы лучше показать гибкость функции makeSandwich. Вы можете приготовить бутерброд с любым вариантом этих трех ингредиентов.В данном случае мы делаем бутерброд с ветчиной, ветчиной, салатом и пшеничным хлебом.
Наведите или щелкните каждую часть кода, чтобы отследить значения.
Когда вы начинаете читать интерактивную диаграмму выше, вы должны начать с предпоследней строки, где мы вызываем функцию makeSandwich и сохраняем результат в hamSandwich.
Увидев три аргумента, вы должны проверить переменные вверху, чтобы увидеть фактические значения, которые мы используем.
Наконец, вы должны взглянуть на объявление функции, чтобы увидеть, как эти три аргумента преобразуются в конечный продукт-бутерброд. Вот еще одна диаграмма.
Вам понравилось это
Ознакомьтесь с остальными руководствами CodeAnalogies по HTML, CSS, JavaScript, если вам нравится этот стиль преподавания.
4. Функции и объекты JavaScript: серьезный JavaScript
Можете ли вы называть себя скриптером? Наверное, вы уже разбираетесь в JavaScript.Но кто хочет быть сценаристом, если можно быть программистом? Пора стать серьезным и подняться на ступеньку выше - пора узнать о функциях и объектах . Они являются ключом к написанию кода, который будет более мощным, лучше организованным и более удобным в обслуживании. Они также широко используются в API-интерфейсах HTML5 JavaScript, поэтому, чем лучше вы их понимаете, тем быстрее вы сможете перейти на новый API и начать управлять им. Эта глава потребует вашего пристального внимания...
Вы уже можете многое сделать с помощью JavaScript, давайте посмотрим на некоторые вещи, которые вы умеете делать:
Однако пока что многие ваши знания носят неформальный характер - конечно, вы можете получить элемент из DOM и назначить ему новый HTML, но если бы мы попросили вас объяснить, что именно представляет собой document.getElementById
технически, что ж, это может быть немного сложнее. Без проблем; к тому времени, когда вы покинете эту главу, вы ее уже закончите.
Теперь, чтобы вы туда попали, мы не собираемся начинать с глубокого технического анализа getElementById
, нет-нет, мы собираемся сделать что-то немного более интересное : мы собираемся расширить JavaScript словарный запас и заставить его делать что-то новое.
Вы использовали встроенные функции, такие как alert
или даже Math.random
, но что, если вы захотите добавить свои собственные? Допустим, мы хотели написать такой код:
Создайте функцию checkGuess
Итак, как все это работает? Что происходит, когда мы фактически вызываем функцию? Вот вид на 10 000 футов:
Хорошо, сначала нам нужна функция.
Допустим, вы только что написали свою новую функцию bark
, которая имеет два параметра: dogName
и dogWeight
, а также очень впечатляющий фрагмент кода, который возвращает лай собаки, конечно, в зависимости от ее веса. .
А теперь вызовем его!
Вы уже знаете, как вызвать функцию: просто используйте ее имя и укажите необходимые аргументы. В этом случае нам нужно два: строка с именем собаки и вес собаки, который является целым числом.
Давайте сделаем этот вызов и посмотрим, как это работает:
И пусть тело функции выполняет свою работу.
После того, как мы присвоили значение каждого аргумента его соответствующему параметру в функции - например, «Fido» для dogName
и целого числа от 50 до dogWeight
- тогда мы готовы оценить все операторы в тело функции.
Операторы оцениваются сверху вниз, как и весь другой код, который вы писали. Отличие заключается в том, что мы делаем это в среде, где имена параметров dogName
и dogWeight
присвоены аргументам, которые вы передали в функцию.
При желании мы можем иметь операторы возврата в теле ...
... и именно здесь мы возвращаем значение обратно в код, который выполняет вызов. Давайте посмотрим, как это работает:
Note
Помните, что функции не обязаны возвращать значение.Но в этом случае функция bark действительно возвращает значение.
Если бы у нас была еще одна минута, чтобы поговорить ...
Мы знаем, мы знаем, что в главе 4 вы думали, что уже летите на реактивном ранце HTML5, и мы доберемся туда. Но прежде чем мы это сделаем, вам действительно нужно понять , что лежит в основе API-интерфейсов JavaScript HTML5, и мы собираемся сделать это в этой главе.
Так что же это за основы? Думайте о HTML5 JavaScript API, как о состоящих из объектов, методов (также известных как функции) и свойств.И поэтому, чтобы по-настоящему освоить эти API, вам нужно хорошо разбираться в этих вещах. Конечно, вы можете попытаться обойтись, не зная их, но вы всегда будете гадать об API, не используя их в полной мере (не говоря уже о том, чтобы делать много ошибок и писать ошибочный код).
Итак, мы просто хотели сказать вам, прежде чем вы слишком углубитесь в эту главу, чтобы рассказать вам, чем мы занимаемся. Вот что замечательно: к концу этой главы вы будете понимать объекты, функции, методы и многие другие связанные вещи лучше, чем примерно 98% существующих сценариев JavaScript.Серьезно.
Нет, они разные.
Когда вы определяете функцию, вы можете определить с одним или несколькими параметрами .
Когда вы вызываете функцию, вы вызываете ее с аргументами :
Таким образом, вы определяете свои параметры только один раз, но вы, вероятно, вызовете свои функции с множеством разных аргументов.
Note
Вы будете удивлены, сколько людей ошибаются - даже книги ошибаются, поэтому, если вы читаете это по-другому в другом месте, теперь вы знаете лучше....
Вы определяете функцию с параметрами, вы вызываете функцию с аргументами.
Знать разницу или рисковать унижением
Вы уже знаете, что можете объявить переменную, используя ключевое слово var
и имя в любом месте вашего скрипта:
И вы видели, что вы также можете объявлять переменные внутри функция:
Если переменная объявлена вне функции, она ГЛОБАЛЬНАЯ. Если он объявлен внутри функции, он ЛОКАЛЬНЫЙ.
А какое это имеет значение? Переменные - это переменные, верно? Ну, , где вы объявляете свои переменные, определяет , насколько они видны для других частей вашего кода, и, позже понимание того, как работают эти два типа переменных, поможет вам написать более удобный в сопровождении код (не говоря уже о том, что поможет вам понять код других).
Где вы определяете свои переменные, определяет их область действия ; то есть, где они определены, а где их нет, где они видны вашему коду, а где нет.Давайте рассмотрим пример переменных с локальной и глобальной областью видимости - помните, что переменные, которые вы определяете вне функции, имеют глобальную область видимости, а переменные функции - локальную:
Когда вы переменная, вы много работаете, и жизнь может быть короткая. То есть, если вы не глобальная переменная, но даже с глобальными переменными, жизнь имеет свои пределы. Но что определяет срок жизни переменной? Подумайте об этом так:
Глобалы живут столько же, сколько и страница. Глобальная переменная начинает свою жизнь, когда ее код JavaScript загружается на страницу.Но жизнь вашей глобальной переменной заканчивается, когда страница исчезает. Даже если вы перезагрузите ту же страницу, все ваши глобальные переменные будут уничтожены, а затем воссозданы на вновь загруженной странице.
Локальные переменные обычно исчезают, когда ваша функция завершается. Локальные переменные создаются при первом вызове функции и действуют до тех пор, пока функция не вернется (со значением или без). Тем не менее, вы можете взять значения ваших локальных переменных и вернуть их из функции до того, как переменные встретятся со своим цифровым создателем.
Note
Мы говорим «обычно», потому что есть несколько продвинутых способов удержать местных жителей подольше, но сейчас мы не будем о них беспокоиться.
Значит, выхода со страницы действительно НЕТ? Если вы - локальная переменная, ваша жизнь приходит и уходит быстро, а если вам повезло быть глобальной, вы все в порядке, пока этот браузер не перезагружает страницу.
Но там только имеет , чтобы убежать со страницы! Мы найдем способ! А мы не можем?
Note
Присоединяйтесь к нам в главе о веб-хранилище, где мы поможем нашим данным избежать ужасного обновления страницы!
Вы «затмеваете» свой мир.
Вот что это означает: допустим, у вас есть глобальная переменная beanCounter
, а затем вы объявляете функцию, например:
Когда вы это делаете, любые ссылки на beanCounter
в функции относятся к локальная переменная, а не глобальная. Итак, мы говорим, что глобальная переменная находится в тени локальной переменной (другими словами, мы не можем ее видеть, потому что локальная версия нам мешает).
Примечание
Обратите внимание, что локальные и глобальные переменные не влияют друг на друга: если вы измените одну, это не повлияет на другую.Это независимые переменные.
Хорошо, вы использовали переменные для хранения чисел, логических значений, строк, массивов и прочего, но упоминали ли мы, что вы также можете назначить функцию переменной? Проверьте это:
Что ж, мы не только не упомянули эту маленькую деталь о функциях до сих пор, но мы также не были полностью честны, когда рассказывали вам об анатомии функции - как оказалось, вы этого не сделали. Не нужно даже давать вашей функции имя. Правильно: ваша функция может быть анонимной .Что, черт возьми, это значит, и зачем вам это нужно? Сначала давайте посмотрим, как создать функцию без имени:
Brain Power
Взгляните на этот код: как вы думаете, что происходит?
Это должно начать выглядеть немного более понятным с учетом того, что мы только что рассмотрели ...
Так в чем же дело? Чем это полезно? Что ж, важно не столько то, что мы можем присвоить функцию переменной, сколько наш способ показать вам, что функция на самом деле является значением .И вы знаете, что можете хранить значения в переменных или массивах, вы можете передавать их в качестве аргументов функциям или, как мы скоро увидим, вы можете назначать их свойствам объектов. Но вместо того, чтобы рассказывать вам, как полезны анонимные функции, давайте просто рассмотрим один из многих способов использования функций, поскольку значения начинают становиться интересными:
Или мы могли бы получить еще более интересное:
Вы, возможно, начинаете видеть эти функции может делать некоторые полезные вещи помимо простой упаковки кода для повторного использования; Чтобы дать вам лучшее представление о том, как в полной мере использовать преимущества функций, мы рассмотрим объекты и посмотрим, как они вписываются в JavaScript, а затем соберем все это воедино.
Ну, мы думали, что уже рассмотрели это ... но если похоже, что мы подобрали вас и отвезли вас на полпути по городу с включенным счетчиком (когда мы могли бы отвезти вас прямо в центр), Что ж, тогда помните, что мы собираемся начать погружаться в API, которые работают с HTML5 , в следующей главе . И для этого потребуется, чтобы вы, , действительно понимали функции , объекты и некоторые другие связанные темы.
Так что держитесь - вы уже на полпути! И не забывайте, что в этой главе вы переходите от сценариста к программисту, от жокея HTML / CSS к тому, кто способен создавать настоящие приложения.
Note
Мы уже упоминали, что, вероятно, вы тоже заработаете намного больше денег?
Ах, наша любимая тема! Объекты поднимут ваши навыки программирования на JavaScript на новый уровень - они являются ключом к управлению сложным кодом, пониманию DOM, организации ваших данных, и они даже являются основным способом упаковки API-интерфейсов HTML5 JavaScript (и это только наш краткий список!). Тем не менее, объекты - сложная тема, не так ли? Ха! Мы собираемся сначала прыгнуть в голову, и вы сразу же ими воспользуетесь.
Вот секрет объектов JavaScript : они всего лишь набор свойств. Возьмем, к примеру, собаку. У собаки есть свойства:
Конечно, Фидо был бы первым, кто признал бы, что для него есть гораздо больше, чем просто несколько свойств, но в данном примере это те, которые нам нужно зафиксировать в программном обеспечении. Давайте подумаем об этих свойствах с точки зрения типов данных JavaScript:
Итак, у нас есть объект с некоторыми свойствами; как нам создать это с помощью JavaScript? Вот как это сделать:
Доступ к свойствам объекта с «точечной» нотацией:
Доступ к свойствам с помощью строки с нотацией []:
Изменение значения свойства:
Перечислить все свойства объекта:
Развлекайтесь с массивом объектов:
Передайте объект функции:
Note
Оператор точки.
Оператор точки (.) Дает вам доступ к свойствам объекта. В общем, его легче читать, чем обозначение [«строка»]:
fido.weight
- это размер fido.фидо. Порода
- порода фидо.fido.name
- это имя fido.fido.loves
- это массив, содержащий интересы fido.
Да, вы можете добавлять или удалять свойства в любое время.
Чтобы добавить свойство к объекту, вы просто присваиваете новому свойству значение, например:
fido.age = 5;
и с этого момента fido
будет иметь новое свойство: age
.
Аналогично, вы можете удалить любое свойство с помощью ключевого слова delete
, например:
delete fido.age;
При удалении свойства вы не просто удаляете значение свойства, вы удаляете само свойство.Фактически, если вы используете fido.age
после его удаления, он будет оценивать как undefined
.
Выражение delete
возвращает true
, если свойство было успешно удалено (или если вы удалили свойство, которое не существует, или если то, что вы пытаетесь удалить, не является свойством объекта).
Мы уже немного говорили о том, как аргументы передаются функциям - аргументы передаются по значению , поэтому, если мы передаем целое число, соответствующий параметр функции получает копию из значения этого целого числа для его использование в функции.Те же правила верны и для объектов: , но , чтобы понять, что это означает, нам нужно более внимательно изучить, что содержит переменная, когда она присваивается объекту.
Когда объект назначается переменной, эта переменная содержит ссылку на объект, а не на сам объект. Думайте о ссылке как об указателе на объект.
Итак, когда вы вызываете функцию и передаете ей объект, вы передаете ссылку на объект - не сам объект, а просто «указатель» на него.Копия ссылки передается в параметр, который затем указывает на исходный объект.
Итак, что все это значит? Что ж, когда вы меняете свойство объекта, вы меняете свойство в исходном объекте , а не в его копии, и поэтому вы увидите все изменения, которые вы вносите в объект внутри и вне функции. Давайте рассмотрим пример, использующий функцию lossWeight
для собак ...
Перевод Фидо на диету ...
Давайте посмотрим, что происходит, когда мы передаем fido
на lostWeight
и меняем собака.вес
собственности.
За кулисами
Мы определили объект, fido, и передаем этот объект в функцию lostWeight.
Параметр dog функции lostWeight получает копию ссылки на fido. Итак, любые изменения в свойствах параметра влияют на переданный объект.
Мы уже попробовали смешивать объекты и функции. Давайте пойдем дальше и напишем код, который сообщает нам, когда состоится следующий показ фильма.Наша функция примет фильм в качестве аргумента и вернет строку, содержащую его при следующем воспроизведении, исходя из вашего текущего времени.
Получите код, введенный с предыдущей страницы, и давайте протестируем его. Вы увидите, что функция getNextShowing
берет любой передаваемый фильм и определяет время следующего показа. Не стесняйтесь создавать собственные новые объекты фильма и тест-драйв. Мы сделали это в 12:30 по нашему местному времени:
Вы же не думали, что объекты предназначены только для хранения чисел, строк и массивов? Объекты активны, они могут что-то делать.Собаки не просто сидят здесь: они лают, бегают, играют в мяч, и собачий объект тоже должен! Учитывая все, что вы узнали в этой главе, вы готовы добавлять поведение своим объектам. Вот как мы это делаем:
Когда у объекта есть функция, мы говорим, что у этого объекта есть метод.
Чтобы вызвать метод объекта, мы используем имя объекта вместе с методом, используя нашу точечную нотацию, и предоставляем все необходимые аргументы.
Теперь, когда ваши знания об объектах расширяются, мы можем вернуться и улучшить код кино.Мы уже написали функцию getNextShowing
, которая принимает фильм в качестве аргумента, но вместо этого мы могли бы сделать эту часть объекта фильма, сделав ее методом. Давайте сделаем это:
На самом деле мы не можем просто бросить функцию в этот объект, потому что getNextShowing
принимает аргумент фильма, и мы действительно хотим вызвать getNextShowing
следующим образом:
это? Нам нужно удалить параметр из определения метода getNextShowing
, но затем нам нужно что-то сделать со всеми ссылками на фильм .показывает время
в коде, потому что, как только мы удалим параметр, фильм
больше не будет существовать как переменная. Давайте посмотрим ...
Мы позволили себе удалить параметр movie
и все ссылки на него. В результате остается код:
. Итак, вот загадка: у нас есть ссылки на свойства , время показа
и заголовок ,
. Обычно в функции мы ссылаемся на локальную переменную, глобальную переменную или параметр функции, но время сеансов
и заголовок
- это свойств объекта movie1
.Что ж, может быть, это просто работает ... кажется, JavaScript может быть достаточно умен, чтобы понять это?
Нет. Не работает. Не стесняйтесь дать ему тест-драйв; JavaScript сообщит вам, что время сеанса и переменные заголовка не определены. Как это может быть?
Хорошо, вот в чем дело: эти переменные являются свойствами объекта, но мы не сообщаем JavaScript, какой объект. Вы можете сказать себе: «Ну, очевидно, мы имеем в виду ЭТОТ объект, вот этот! Как тут могло быть какое-то недоразумение? » И да, нам нужны свойства этого самого объекта.Фактически, в JavaScript есть ключевое слово с именем , это
, и именно так вы говорите JavaScript, что имеете в виду , этот объект, а мы находимся в .
Теперь ситуация на самом деле немного сложнее, чем кажется здесь, и мы собираемся перейти к этому через секунду, но сейчас мы собираемся добавить ключевое слово это
и заставить этот код работать.
Давайте добавим , это
в каждое место, где мы указываем свойство, чтобы мы сообщали JavaScript, что нам нужно свойство в этом объекте :
Вперед, введите приведенный выше код, а также добавьте функцию getNextShowing
в ваш объект movie2
(просто скопируйте и вставьте его).Затем внесите следующие изменения в свой предыдущий тестовый код. После этого дайте ему вращение! Вот что у нас получилось:
А, хороший глаз.
У вас отличное чутье, если вы заметили, что мы дублируем код, когда копируем getNextShowing
в несколько объектов фильма. Одна из целей «объектно-ориентированного» программирования - максимизировать повторное использование кода - здесь мы не используем повторно какой-либо код, фактически мы создаем каждый объект как единичный объект, и наши объекты фильма просто совпадают. по соглашению (и копирование и вставка!).Это не только бесполезная трата, но и подверженность ошибкам.
Есть гораздо лучший способ сделать это, используя конструктор . Что такое конструктор? Это просто специальная функция, которую мы напишем, которая может создавать для нас объекты и делать их все одинаковыми. Думайте об этом как о небольшой фабрике, которая принимает значения свойств, которые вы хотите установить в своем объекте, а затем возвращает вам красивый новый объект со всеми необходимыми свойствами и методами.
Создадим конструктор ...
Сделаем конструктор для собак.Мы уже знаем, как мы хотим, чтобы наши объекты-собаки выглядели: у них есть свойства имени, породы и веса, и у них есть метод лая. Итак, что нужно сделать нашему конструктору, так это принять значения свойств в качестве параметров, а затем вернуть нам объект dog, готовый к лаять. Вот код:
Итак, давайте пройдемся по нему еще раз, чтобы убедиться, что мы его получили. Dog - это функция-конструктор, которая принимает набор аргументов, которые просто являются начальными значениями для свойств, которые нам нужны: name, порода и вес.Получив эти значения, он назначает свойства, используя ключевое слово и
. Это также определяет наш метод коры. Результат всего этого? Конструктор Dog возвращает новый объект. Давайте посмотрим, как на самом деле использовать конструктор.
Теперь, когда наша фабрика построена, мы можем использовать ее для создания собак. Есть только одна вещь, о которой мы вам не сказали, а именно о том, что вам нужно вызывать функцию-конструктор особым образом, помещая перед вызовом ключевое слово new
. Вот несколько примеров:
Давайте еще раз рассмотрим, что здесь происходит: мы создаем три разных объекта dog, каждый со своими собственными свойствами, используя ключевое слово new
с созданным нами конструктором Dog.Конструктор возвращает объект Dog, настроенный с использованием переданных нами аргументов.
Затем мы вызываем метод bark
для каждого из них - обратите внимание, что мы используем один и тот же метод bark
для всех собак, и когда все собаки лают , это
указывает на объект "собака", который сделал вызов. Итак, если мы вызываем метод bark
на fido
, тогда в методе bark этот
устанавливается на объект fido. Давайте подробнее рассмотрим, как это происходит.
За кулисами
Каждый раз, когда мы помещаем это
в код метода, он будет интерпретироваться как ссылка на объект, для которого был вызван метод. Итак, если мы вызовем fido.bark
, тогда , этот
будет ссылаться на fido
. Или, если мы назовем его для нашего объекта dog tiny
, тогда этот
будет ссылаться на tiny
в вызове этого метода. Как этот
знает, какой объект он представляет? Давайте посмотрим:
Допустим, у нас есть объект dog, назначенный для fido:
И мы вызываем bark () на fido:
Итак, «this» всегда относится к объекту, к которому был вызван метод. независимо от того, сколько собак мы создаем, чтобы лаять:
Теперь, когда у вас есть конструктор Movie, пора создать несколько объектов Movie! Идите вперед и введите функцию конструктора Movie, а затем добавьте приведенный ниже код и попробуйте свой конструктор.Мы думаем, вы согласитесь, что это намного более простой способ создания объектов.
Теперь вы, возможно, начали замечать ...
... что объекты вокруг вас. Например, документ
и окно
являются объектами, как и элементы, которые мы получаем из document.getElementById
. И это лишь некоторые из многих объектов, с которыми мы столкнемся - когда мы дойдем до API HTML5, мы увидим объекты повсюду!
Давайте еще раз взглянем на некоторые объекты, которые вы использовали все время в этой книге:
Когда вы пишете код для браузера, объект window
всегда будет частью вашей жизни.Объект window представляет как глобальную среду для ваших программ JavaScript, так и главное окно вашего приложения, и поэтому он содержит множество основных свойств и методов. Давайте посмотрим на это:
Window - это глобальный объект.
Это может показаться немного странным, но объект окна действует как ваша глобальная среда, поэтому имена любых свойств или методов из окна разрешаются, даже если вы не добавляете их с помощью window
.
Кроме того, любые определяемые вами глобальные переменные также помещаются в пространство имен окна, поэтому вы можете ссылаться на них как на окно .моя переменная
.
Одна вещь, которую мы до сих пор часто использовали в этой книге, - это обработчик событий window.onload
. Назначая функцию свойству window.onload
, мы можем гарантировать, что наш код не будет запущен до тех пор, пока страница не будет загружена и DOM не будет полностью настроен. Теперь в операторе window.onload
происходит много всего, так что давайте еще раз взглянем, и все начнется для вас:
Документ Объект
- еще одно знакомое лицо; это объект, который мы использовали для доступа к DOM.И, как вы только что видели, на самом деле это свойство объекта window
. Конечно, мы не использовали его как window.document
, потому что нам это не нужно. Давайте быстро заглянем под обложку, чтобы увидеть его наиболее интересные свойства и методы:
В начале этой главы мы обещали, что к концу главы вы поймете document.getElementById
. Что ж, вы сделали это с помощью функций, объектов и методов, и теперь вы готовы! Проверьте это:
То, что выглядело сбивающей с толку строкой синтаксиса, теперь имеет гораздо большее значение, не так ли? Теперь эта переменная div
также является объектом: объектом элемента.Давайте посмотрим и на это поближе.
При работе с такими методами, как getElementById
, мы не должны забывать, что возвращаемые ими элементы также являются объектами! Хорошо, возможно, вы этого не осознавали, но теперь, когда вы знаете, вы можете начать думать, что все в JavaScript - это объект, и, что ж, вы в значительной степени правы.
Вы уже видели некоторые свидетельства свойств элемента, например свойство innerHTML
; давайте рассмотрим некоторые из наиболее примечательных свойств и методов:
Note
Да, String - это объект! Ознакомьтесь с хорошей ссылкой на JavaScript, чтобы получить все подробности о его свойствах и методах.
Шпаргалка по JavaScript на 2021 год (включая версию .PDF)
Ниже вы можете найти шпаргалку по Javascript в формате .pdf, а также в тексте.
Шпаргалка по JavaScript
Основы JavaScript
Давайте начнем с основ - как включить JavaScript на веб-сайт.
Включение JavaScript в HTML-страницу
Чтобы включить JavaScript на страницу, вам нужно обернуть его тегами С помощью этого ввода браузер может правильно идентифицировать и выполнить код. Вы также можете поместить JavaScript в отдельный файл и назвать его внутри вашего HTML. Таким образом, вы можете хранить разные типы кода отдельно друг от друга, чтобы файлы были лучше организованы. Если ваш код находится в файле с именем Комментарии важны, потому что они помогают другим людям понять, что происходит в вашем коде, или напоминают вам, если вы что-то забыли сами.Помните, что они должны быть правильно помечены, чтобы браузер не пытался их выполнить. В JavaScript у вас есть два разных варианта: Переменные - это замещающие значения, которые можно использовать для выполнения операций.Вы должны быть знакомы с ними из класса математики. var , const , let У вас есть три различных возможности для объявления переменной в JavaScript, каждая из которых имеет свои особенности: Переменные могут содержать разные типы значений и типы данных. Вы используете Есть еще возможности. Обратите внимание, что переменные чувствительны к регистру. Это означает, что Объекты - это определенные виды переменных. Это переменные, которые могут иметь свои собственные значения и методы. Последние - это действия, которые вы можете выполнять с объектами. Следующим в нашей шпаргалке по JavaScript идут массивы.Массивы являются частью многих языков программирования. Это способ организации переменных и свойств в группы. Вот как создать его на JavaScript: Теперь у вас есть массив под названием После создания массивов с ними можно делать несколько вещей: Если у вас есть переменные, вы можете использовать их для выполнения различных операций.Для этого вам потребуются операторы. Функции JavaScript - это блоки кода, которые выполняют определенную задачу.Базовая функция выглядит так: Как видите, он состоит из ключевого слова функции Распространенным применением функций является вывод данных.Для вывода у вас есть следующие варианты: Глобальные функции - это функции, встроенные в каждый браузер, поддерживающий JavaScript. Циклы являются частью большинства языков программирования.Они позволяют выполнять блоки кода желаемое количество раз с разными значениями: У вас есть несколько параметров для создания петель: Если - Остальное Заявления Эти типы утверждений легко понять.Используя их, вы можете установить условия выполнения вашего кода. Если выполняются определенные условия, что-то делается, если нет - выполняется что-то другое. Концепция, аналогичная Строки - это то, что JavaScript вызывает текст, который не выполняет никаких функций, но может отображаться на экране. В данном случае В JavaScript строки помечаются одинарными или двойными кавычками. Если вы хотите использовать кавычки в строке, вам нужно использовать специальные символы: Помимо этого у вас также есть дополнительные escape-символы: Есть много разных способов работы со строками: Регулярные выражения - это шаблоны поиска, используемые для сопоставления комбинаций символов в строках. abc]
- Найти любой символ, которого нет в скобках. Вызов внешнего файла JavaScript
myscript.js
, вы должны назвать его:
Включая комментарии
//
/ *
и * /
, чтобы избежать его выполнения Переменные в JavaScript
var
- Самая распространенная переменная. Его можно переназначить, но доступ к нему возможен только внутри функции. Переменные, определенные с помощью var
, перемещаются наверх при выполнении кода. const
- не могут быть переназначены и недоступны, пока они не появятся в коде. let
- Подобно const
, переменная let
может быть переназначена, но не объявлена повторно. Типы данных
=
для их назначения: var age = 23
var x
var a = "init"
var b = 1 + 2 + 3
var c = true
const PI = 3.14
var name = {firstName: "John", lastName: "Doe"}
lastname
и lastName
будут обрабатываться как две разные переменные. Объектов
var person = {
firstName: "Джон",
lastName: "Лань",
возраст: 20,
национальность: «немец»
};
Следующий уровень: массивы
var fruit = [«Банан», «Яблоко», «Груша»];
fruit
, который содержит три элемента, которые вы можете использовать для будущих операций. Массивные методы
concat ()
- Объединить несколько массивов в один indexOf ()
- Возвращает первую позицию, в которой данный элемент появляется в массиве join ()
- Объединить элементы массива в одну строку и вернуть строку lastIndexOf ()
- Выдает последнюю позицию, в которой данный элемент появляется в массиве pop ()
- Удаляет последний элемент массива push ()
- Добавить новый элемент в конец reverse ()
- Сортировка элементов в порядке убывания shift ()
- Удалить первый элемент массива slice ()
- Извлекает копию части массива в новый массив sort ()
- Сортировка элементов по алфавиту splice ()
- Добавляет элементы указанным способом и позиционирует toString ()
- Преобразует элементы в строки unshift ()
- добавляет новый элемент в начало valueOf ()
- Возвращает примитивное значение указанного объекта Операторы
Основные операторы
+
- Дополнение -
- Вычитание *
- умножение/
- Подразделение (...)
- Оператор группировки, операции в скобках выполняются раньше, чем операции за пределами%
- Модуль (остаток) ++
- Числа приращения -
- Номера декремента Операторы сравнения
==
- равно ===
- Равнозначный и равный тип! =
- не равно! ==
- Не равно значение или не равно тип>
- Больше <
- Менее> =
- больше или равно <=
- меньше или равно?
- Тернарный оператор Логические операторы
&&
- логический и ||
- логический или!
- Логическое не Побитовые операторы
и
- И выписка |
- Оператор OR ~
- НЕ ^
- XOR <<
- Сдвиг влево >>
- Сдвиг вправо >>>
- смещение нуля вправо Функции
имя функции (параметр1, параметр2, параметр3) {
// что делает функция
}
и имени. Параметры функции заключены в квадратные скобки, а то, что функция выполняет, заключено в фигурные скобки. Вы можете создавать свои собственные, но чтобы облегчить себе жизнь - также есть ряд функций по умолчанию. Вывод данных
alert ()
- Вывод данных в поле предупреждения в окне браузера confirm ()
- Открывает диалог да / нет и возвращает истину / ложь в зависимости от нажатия пользователем console.log ()
- Записывает информацию в консоль браузера, подходит для целей отладки document.write ()
- Запись непосредственно в документ HTML prompt ()
- Создает диалог для пользовательского ввода Глобальные функции
decodeURI ()
- Декодирует унифицированный идентификатор ресурса (URI), созданный с помощью encodeURI
или аналогичного decodeURIComponent ()
- Декодирует компонент URI encodeURI ()
- Кодирует URI в UTF-8 encodeURIComponent ()
- То же, но для компонентов URI eval ()
- оценивает код JavaScript, представленный в виде строки isFinite ()
- Определяет, является ли переданное значение конечным числом isNaN ()
- Определяет, является ли значение NaN или нет. Number ()
—- Возвращает число, преобразованное из его аргумента parseFloat ()
- Анализирует аргумент и возвращает число с плавающей запятой parseInt ()
- Анализирует его аргумент и возвращает целое число Циклы JavaScript
for (до цикла; условие для цикла; выполнить после цикла) {
// что делать во время цикла
}
для
- Самый распространенный способ создания цикла в JavaScript while
- Устанавливает условия, при которых цикл выполняется do while
- аналогично циклу while
, но он выполняется хотя бы один раз и в конце выполняет проверку, чтобы увидеть, выполняется ли условие для повторного выполнения break
—Используется для остановки и выхода из цикла при определенных условиях. продолжить
- Пропускать части цикла при соблюдении определенных условий if (condition) {
// что делать, если условие выполнено
} еще {
// что делать, если условие не выполняется
}
, если еще
- это оператор switch
. Однако с помощью переключателя вы выбираете один из нескольких блоков кода для выполнения. Струны
var person = "Джон Доу";
John Doe
- строка. Побег персонажей
\ '
- Одиночная кавычка \ "
- Двойная кавычка \
- косая черта \ b
- Backspace \ f
- Подача формы \ n
- Новая линия \ r
- Возврат каретки \ t
- Табулятор горизонтальный \ v
- Вертикальный табулятор Строковые методы
charAt ()
- Возвращает символ в указанной позиции внутри строки charCodeAt ()
- Предоставляет Unicode символа в этой позиции concat ()
- Объединяет (объединяет) две или более строк в одну fromCharCode ()
- Возвращает строку, созданную из указанной последовательности кодовых единиц UTF-16 indexOf ()
- Предоставляет позицию первого вхождения указанного текста в строке lastIndexOf ()
- То же, что и indexOf ()
, но с последним вхождением, поиск назад match ()
- Извлекает совпадения строки с шаблоном поиска replace ()
- Найти и заменить указанный текст в строке search ()
- Выполняет поиск совпадающего текста и возвращает его позицию slice ()
- Извлекает часть строки и возвращает ее как новую строку split ()
- Разделяет строковый объект на массив строк в указанной позиции substr ()
- Аналогично slice ()
, но извлекает подстроку в зависимости от указанного количества символов substring ()
- Также аналогично slice ()
, но не может принимать отрицательные индексы toLowerCase ()
- Преобразование строк в нижний регистр toUpperCase ()
- Преобразование строк в верхний регистр valueOf ()
- Возвращает примитивное значение (не имеющее свойств или методов) строкового объекта Синтаксис регулярного выражения
[0-9]
- Используется для поиска любой цифры от 0 до 9 [A – z]
- Найти любой символ от верхнего регистра A до нижнего z (a | b | c)
- Найдите любую из альтернатив, разделенных |
Метасимволы
-
.
- Найти один символ, кроме символа новой строки или конца строки -
\ w
- Символ слова -
\ W
- Несловесный символ -
\ d
- Цифра -
\ D
- нецифровой символ -
\ s
- Пробельный символ -
\ S
- непробельный символ -
\ b
- Найти совпадение в начале / конце слова -
\ B
- совпадение не в начале / конце слова -
\ 0
- символ NUL -
\ n
- Символ новой строки -
\ f
- Символ подачи формы -
\ r
- символ возврата каретки -
\ t
- символ табуляции -
\ v
- Вертикальный символ табуляции -
\ xxx
- символ, заданный восьмеричным числом xxx -
\ xdd
- Символ, заданный шестнадцатеричным числом dd -
\ uxxxx
- символ Юникода, заданный шестнадцатеричным числом XXXX
Кванторы
-
n +
- соответствует любой строке, содержащей хотя бы один n -
n *
- Любая строка, содержащая ноль или более вхождений n -
н?
- Строка, содержащая ноль или одно вхождение n -
n {X}
- строка, содержащая последовательность X n -
n {X, Y}
- Строки, содержащие последовательность от X до Y n -
n {X,}
- соответствует любой строке, содержащей последовательность не менее X n -
n $
- Любая строка с n в конце -
^ n
- Строка с n в начале -
? = N
- Любая строка, за которой следует определенная строка n -
?! N
- Строка, за которой не следует конкретная строка ni
Числа и математика
В JavaScript вы также можете работать с числами, константами и выполнять математические функции.
Количество Объекты
-
MAX_VALUE
- максимальное числовое значение, представляемое в JavaScript -
MIN_VALUE
- наименьшее положительное числовое значение, представляемое в JavaScript -
NaN
- «Не-число» -
NEGATIVE_INFINITY
- Отрицательное значение бесконечности -
POSITIVE_INFINITY
- значение положительной бесконечности
Количество методов
-
toExponential ()
- Возвращает строку с округленным числом, записанным в экспоненциальной нотации -
toFixed ()
- Возвращает строку числа с указанным количеством десятичных знаков -
toPrecision ()
- Строка числа, записанного с указанной длиной -
toString ()
- Возвращает число в виде строки -
valueOf ()
- Возвращает число как число
Математические свойства
-
E
- Число Эйлера -
LN2
- Натуральный логарифм 2 -
LN10
- Натуральный логарифм 10 -
LOG2E
- Логарифм E -
LOG10E
- Логарифм по основанию 10 E -
PI
- Номер PI -
SQRT1_2
- Корень квадратный из 1/2 -
SQRT2
- квадратный корень из 2
по основанию 2
Математические методы
-
abs (x)
- возвращает абсолютное (положительное) значение x -
acos (x)
- Арккосинус x в радианах -
asin (x)
- Арксинус x в радианах -
atan (x)
- Арктангенс x как числовое значение -
atan2 (y, x)
- Арктангенс частного его аргументов -
ceil (x)
- Значение x, округленное в большую сторону до ближайшего целого числа -
cos (x)
- Косинус x (x в радианах) -
exp (x)
- Значение E x -
этаж (x)
- Значение x, округленное в меньшую сторону до ближайшего целого числа -
log (x)
- Натуральный логарифм (основание E) x -
макс (x, y, z ,..., n)
- возвращает число с наибольшим значением -
min (x, y, z, ..., n)
- То же самое для числа с наименьшим значением -
pow (x, y)
- X в степени y -
random ()
- возвращает случайное число от 0 до 1 -
round (x)
- Значение x, округленное до ближайшего целого числа -
sin (x)
- Синус x (x в радианах) -
sqrt (x)
- Квадратный корень из x -
tan (x)
- Тангенс угла
.
Работа с датами в JavaScript
Вы также можете работать с датой и временем и изменять их с помощью JavaScript.Это следующая глава шпаргалки по JavaScript.
Установка дат
-
Date ()
- Создает новый объект даты с текущими датой и временем -
Дата (2017, 5, 21, 3, 23, 10, 0)
- Создание настраиваемого объекта даты. Цифры представляют год, месяц, день, час, минуты, секунды, миллисекунды. Вы можете пропустить все, что хотите, кроме года и месяца. -
Дата («2017-06-23»)
- Объявление даты в виде строки
Получение значений даты и времени
-
getDate ()
- Получить день месяца в виде числа (1-31) -
getDay ()
- День недели в виде числа (0-6) -
getFullYear ()
- Год в виде четырехзначного числа (гггг) -
getHours ()
- Получить час (0-23) -
getMilliseconds ()
- миллисекунда (0-999) -
getMinutes ()
- Получить минуту (0-59) -
getMonth ()
- Месяц в виде числа (0-11) -
getSeconds ()
- Получить второй (0-59) -
getTime ()
- Получить миллисекунды с 1 января 1970 г. -
getUTCDate ()
- День (число) месяца в указанную дату по всемирному координированному времени (также доступно для дня, месяца, полного года, часов, минут и т. Д.)) -
parse
- Анализирует строковое представление даты и возвращает количество миллисекунд с 1 января 1970 г.
Установить часть даты
-
setDate ()
- Установить день в виде числа (1-31) -
setFullYear ()
- Устанавливает год (необязательно месяц и день) -
setHours ()
- Установить час (0-23) -
setMilliseconds ()
- Установить миллисекунды (0-999) -
setMinutes ()
- Устанавливает минуты (0-59) -
setMonth ()
- Установить месяц (0-11) -
setSeconds ()
- Устанавливает секунды (0-59) -
setTime ()
- Установить время (в миллисекундах с 1 января 1970 г.) -
setUTCDate ()
- Устанавливает день месяца для указанной даты по всемирному координированному времени (также доступно для дня, месяца, полного года, часов, минут и т. Д.)
Режим DOM
DOM - это объектная модель документа страницы. Это код структуры веб-страницы. В JavaScript есть множество различных способов создания HTML-элементов (называемых узлами) и управления ими.
Свойства узла
-
attributes
- Возвращает живую коллекцию всех атрибутов, зарегистрированных для элемента -
baseURI
- Предоставляет абсолютный базовый URL-адрес элемента HTML -
childNodes
- Предоставляет коллекцию дочерних узлов элемента -
firstChild
- Возвращает первый дочерний узел элемента -
lastChild
- Последний дочерний узел элемента -
nextSibling
- дает следующий узел на том же уровне дерева узлов -
nodeName
- возвращает имя узла -
nodeType
- Возвращает тип узла -
nodeValue
- Устанавливает или возвращает значение узла -
ownerDocument
- объект документа верхнего уровня для этого узла -
parentNode
- возвращает родительский узел элемента -
previousSibling
- Возвращает узел, непосредственно предшествующий текущему -
textContent
- Устанавливает или возвращает текстовое содержимое узла и его потомков
.
Узловые методы
-
appendChild ()
- Добавляет новый дочерний узел к элементу в качестве последнего дочернего узла -
cloneNode ()
- Клонирует элемент HTML -
compareDocumentPosition ()
- Сравнивает положение двух элементов в документе -
getFeature ()
- Возвращает объект, который реализует API указанной функции -
hasAttributes ()
- Возвращает истину, если элемент имеет какие-либо атрибуты, иначе ложь -
hasChildNodes ()
- Возвращает истину, если у элемента есть дочерние узлы, в противном случае - ложь -
insertBefore ()
- Вставляет новый дочерний узел перед указанным существующим дочерним узлом -
isDefaultNamespace ()
- Возвращает истину, если URI указанного пространства имен является значением по умолчанию, в противном случае - ложь -
isEqualNode ()
- Проверяет, равны ли два элемента -
isSameNode ()
- Проверяет, являются ли два элемента одним и тем же узлом -
isSupported ()
- Возвращает истину, если указанная функция поддерживается элементом -
lookupNamespaceURI ()
- Возвращает URI пространства имен, связанный с заданным узлом -
lookupPrefix ()
- Возвращает строку DOMString, содержащую префикс для URI данного пространства имен, если он присутствует. -
normalize ()
- Объединяет соседние текстовые узлы и удаляет пустые текстовые узлы в элементе -
removeChild ()
- Удаляет дочерний узел из элемента -
replaceChild ()
- Заменяет дочерний узел в элементе
Методы элементов
-
getAttribute ()
- Возвращает указанное значение атрибута узла элемента -
getAttributeNS ()
- Возвращает строковое значение атрибута с указанным пространством имен и именем -
getAttributeNode ()
- Получает указанный узел атрибута -
getAttributeNodeNS ()
- Возвращает узел атрибута для атрибута с заданным пространством имен и именем -
getElementsByTagName ()
- Предоставляет коллекцию всех дочерних элементов с указанным именем тега -
getElementsByTagNameNS ()
- Возвращает живую HTMLCollection элементов с определенным именем тега, принадлежащих данному пространству имен -
hasAttribute ()
- Возвращает истину, если элемент имеет какие-либо атрибуты, в противном случае - ложь -
hasAttributeNS ()
- Предоставляет значение истина / ложь, указывающее, имеет ли текущий элемент в данном пространстве имен указанный атрибут -
removeAttribute ()
- Удаляет указанный атрибут из элемента -
removeAttributeNS ()
- Удаляет указанный атрибут из элемента в определенном пространстве имен -
removeAttributeNode ()
- Удаляет указанный узел атрибута и возвращает удаленный узел -
setAttribute ()
- Устанавливает или изменяет указанный атрибут на указанное значение -
setAttributeNS ()
- Добавляет новый атрибут или изменяет значение атрибута с заданным пространством имен и именем -
setAttributeNode ()
- Устанавливает или изменяет указанный узел атрибута -
setAttributeNodeNS ()
- Добавляет новый узел атрибута пространства имен к элементу
Работа с пользовательским браузером
Помимо HTML-элементов, JavaScript также может учитывать браузер пользователя и включать его свойства в код.
Свойства окна
-
закрыто
- Проверяет, закрыто ли окно или нет, и возвращает истину или ложь -
defaultStatus
- Устанавливает или возвращает текст по умолчанию в строке состояния окна -
документ
- возвращает объект документа для окна -
кадров
- Возвращает все элементы -
история
- Предоставляет объект истории для окна -
innerHeight
- внутренняя высота области содержимого окна -
innerWidth
- внутренняя ширина области содержимого -
length
- Узнать количество -
location
- Возвращает объект местоположения для окна -
name
- Устанавливает или возвращает имя окна -
навигатор
- возвращает объект навигатора для окна -
opener
- Возвращает ссылку на окно, создавшее окно -
outerHeight
- внешняя высота окна, включая панели инструментов / полосы прокрутки -
outerWidth
- внешняя ширина окна, включая панели инструментов / полосы прокрутки -
pageXOffset
- Количество пикселей, на которое текущий документ прокручен по горизонтали -
pageYOffset
- Количество пикселей, на которые документ был прокручен по вертикали -
parent
- Родительское окно текущего окна -
screen
- Возвращает объект Screen для окна -
screenLeft
- Горизонтальная координата окна (относительно экрана) -
screenTop
- Вертикальная координата окна -
screenX
- То же, что иscreen Left
, но необходимо для некоторых браузеров -
screenY
- То же, что иscreenTop
, но требуется для некоторых браузеров -
self
- Возвращает текущее окно -
status
- Устанавливает или возвращает текст в строке состояния окна -
вверху
- возвращает самое верхнее окно браузера
Оконные методы
-
alert ()
- Отображает окно предупреждения с сообщением и кнопкой OK -
blur ()
- Убирает фокус из текущего окна -
clearInterval ()
- Очищает таймер, установленный с помощьюsetInterval ()
-
clearTimeout ()
- Очищает таймер, установленный с помощьюsetTimeout ()
-
close ()
- Закрывает текущее окно -
confirm ()
- Отображает диалоговое окно с сообщением и OK и Отмена кнопки -
focus ()
- Устанавливает фокус на текущее окно -
moveBy ()
- Перемещает окно относительно его текущей позиции -
moveTo ()
- Перемещает окно в указанную позицию -
open ()
- открывает новое окно браузера -
print ()
- Распечатывает содержимое текущего окна -
prompt ()
- Отображает диалоговое окно, предлагающее посетителю ввести данные -
resizeBy ()
- Изменяет размер окна на указанное количество пикселей -
resizeTo ()
- Изменяет размер окна до указанной ширины и высоты -
scrollBy ()
- Прокручивает документ на указанное количество пикселей -
scrollTo ()
- Прокручивает документ до указанных координат -
setInterval ()
- Вызывает функцию или оценивает выражение с заданными интервалами -
setTimeout ()
- Вызывает функцию или оценивает выражение после указанного интервала -
stop ()
- Останавливает загрузку окна
Свойства экрана
-
availHeight
- возвращает высоту экрана (исключая панель задач Windows) -
availWidth
- Возвращает ширину экрана (исключая панель задач Windows) -
colorDepth
- Возвращает битовую глубину цветовой палитры для отображения изображений -
высота
- Общая высота экрана -
pixelDepth
- Цветовое разрешение экрана в битах на пиксель -
ширина
- Общая ширина экрана
События JavaScript
События - это вещи, которые могут происходить с элементами HTML и выполняются пользователем.Язык программирования может отслеживать эти события и запускать действия в коде. Ни одна шпаргалка по JavaScript не была бы полной без них.
Мышь
-
onclick
- Событие происходит, когда пользователь нажимает на элемент -
oncontextmenu
- Пользователь щелкает правой кнопкой мыши элемент, чтобы открыть контекстное меню -
ondblclick
- Пользователь дважды щелкает элемент -
onmousedown
- Пользователь нажимает кнопку мыши над элементом -
onmouseenter
- указатель перемещается на элемент -
onmouseleave
- Указатель выходит за пределы элемента -
onmousemove
- указатель движется, пока он находится над элементом -
onmouseover
- Когда указатель перемещается на элемент или один из его дочерних элементов -
onmouseout
- Пользователь перемещает указатель мыши за пределы элемента или одного из его дочерних элементов -
onmouseup
- Пользователь отпускает кнопку мыши, находясь над элементом
Клавиатура
-
onkeydown
- Когда пользователь нажимает клавишу -
onkeypress
- момент, когда пользователь начинает нажимать клавишу -
onkeyup
- Пользователь отпускает клавишу
Рама
-
onabort
- Загрузка носителя прервана -
onbeforeunload
- Событие происходит перед выгрузкой документа -
onerror
- Ошибка при загрузке внешнего файла -
onhashchange
- были внесены изменения в якорную часть URL-адреса -
onload
- Когда объект загружен -
onpagehide
- Пользователь уходит с веб-страницы -
onpageshow
- Когда пользователь переходит на веб-страницу -
onresize
- Размер представления документа изменен -
onscroll
- Полоса прокрутки элемента прокручивается -
onunload
- Событие происходит, когда страница выгружена
Форма
-
onblur
- Когда элемент теряет фокус -
onchange
- изменяется содержимое элемента формы (для)
-
onfocus
- элемент получает фокус -
onfocusin
- Когда элемент собирается получить фокус -
onfocusout
- Элемент собирается потерять фокус -
oninput
- пользовательский ввод элемента -
oninvalid
- Недействительный элемент -
onreset
- Форма сброшена -
onsearch
- Пользователь что-то пишет в поле поиска (для -
onselect
- Пользователь выделяет текст (для -
onsubmit
- Форма отправлена
Перетащите
-
ondrag
- Элемент перетаскивается -
ondragend
- Пользователь закончил перетаскивание элемента -
ondragenter
- перетаскиваемый элемент попадает в цель падения -
ondragleave
- Перетаскиваемый элемент покидает цель падения -
ondragover
- Перетаскиваемый элемент находится над целью падения -
ondragstart
- Пользователь начинает перетаскивать элемент -
ondrop
- перетаскиваемый элемент сбрасывается на цель перетаскивания
Буфер обмена
-
oncopy
- Пользователь копирует содержимое элемента -
oncut
- Пользователь сокращает содержимое элемента -
onpaste
- Пользователь вставляет содержимое в элемент
Медиа
-
onabort
- загрузка носителя прервана -
oncanplay
- Браузер может начать воспроизведение мультимедиа (например,грамм. файл достаточно буферизован) -
oncanplaythrough
- Браузер может воспроизводить мультимедиа без остановки -
ondurationchange
- Продолжительность смены носителя -
onended
- СМИ достигли своего конца -
onerror
- Происходит при возникновении ошибки при загрузке внешнего файла -
onloadeddata
- Медиа данные загружены -
onloadedmetadata
- метаданные (например, размеры и продолжительность) загружены -
onloadstart
- Браузер начинает поиск указанного носителя -
onpause
- Медиа приостановлено пользователем или автоматически -
onplay
- Медиа запущен или больше не приостановлен -
onplaying
- Медиа воспроизводится после приостановки или остановки для буферизации -
onprogress
- Браузер загружает медиа -
onratechange
- Скорость воспроизведения мультимедиа меняется -
onseeked
- Пользователь завершил перемещение / переход к новой позиции на носителе -
onseeking
- Пользователь начинает двигаться / пропускать -
установлен
- Браузер пытается загрузить носитель, но он недоступен -
onsuspend
- Браузер намеренно не загружает мультимедиа -
ontimeupdate
- Игровая позиция изменилась (e.грамм. из-за перемотки вперед) -
onvolumechange
- изменилась громкость мультимедиа (включая отключение звука) -
ожидает
- Медиа приостановлена, но ожидается возобновление (например, буферизация)
Анимация
-
animationend
- CSS-анимация завершена -
animationiteration
- повторяется CSS-анимация -
animationstart
- CSS-анимация началась
Прочие
-
transitionend
- срабатывает, когда переход CSS завершен -
onmessage
- сообщение получено через источник события -
onoffline
- Браузер начинает работать офлайн -
онлайн
- Браузер начинает работать онлайн -
onpopstate
- При изменении истории окна -
onshow
- Элемент
отображается как контекстное меню
-
onstorage
- область веб-хранилища обновлена -
onggle
- Пользователь открывает или закрывает элемент
-
onwheel
- Колесо мыши наматывается вверх или вниз над элементом -
ontouchcancel
- сенсорный экран прерывается -
ontouchend
- Пользователь убирает палец с сенсорного экрана -
ontouchmove
- Проводится пальцем по экрану -
ontouchstart
- Приложен палец к сенсорному экрану
Ошибки
При работе с JavaScript могут возникать разные ошибки.Есть несколько способов обращения с ними:
-
try
- позволяет определить блок кода для проверки ошибок -
catch
- Настроить блок кода для выполнения в случае ошибки -
throw
- Создавать собственные сообщения об ошибках вместо стандартных ошибок JavaScript -
finally
- Позволяет выполнить код после попытки и поймать, независимо от результата
Имя ошибки Значения
JavaScript также имеет встроенный объект ошибки.Он имеет два свойства:
-
name
- Устанавливает или возвращает имя ошибки -
сообщение
- Устанавливает или возвращает сообщение об ошибке в строке из
Свойство error может возвращать шесть различных значений в качестве своего имени:
-
EvalError
- Произошла ошибка в функцииeval ()
-
RangeError
- Число «вне допустимого диапазона» -
ReferenceError
- Произошла недопустимая ссылка -
SyntaxError
- Произошла синтаксическая ошибка -
TypeError
- Произошла ошибка типа -
URIError
- Произошла ошибкаencodeURI ()
Шпаргалка по JavaScript в двух словах
JavaScript приобретает все большее значение как язык программирования.Это все более популярный язык для создания веб-ресурсов благодаря своей проверенной репутации и преимуществам.
В приведенной выше шпаргалке по JavaScript мы собрали многие из самых основных и важных операторов, функций, принципов и методов. Он предоставляет хороший обзор языка и справочник как для разработчиков, так и для учащихся. Надеемся, вы сочли это полезным.
У вас есть дополнения к шпаргалке по JavaScript? Пожалуйста, дайте нам знать в разделе комментариев ниже!
Изучение собственных функций JavaScript и их использования - Scotch.io
JavaScript становится самым популярным языком программирования, хотя его понимают неправильно. Понимать внутреннее устройство JavaScript сложно. Точно так же принуждение JavaScript к более традиционной парадигме, такой как объектно-ориентированное или функциональное программирование, может быть не менее сложной задачей. Я хочу выделить ключевые нативные функции в надежде прояснить внутренности JavaScript.
В этой статье я обсуждаю следующие варианты поведения:
- Позвонить / Подать заявку
- Переплет
- Карта
- Фильтр
Сначала я определяю функцию (с подписью Mozilla), затем привожу пример и, наконец, реализую ее.
Чтобы объяснить такое поведение, мне нужно разъяснить запутанное ключевое слово this, а также объект, подобный массиву arguments.
Область видимости JavaScript основана на функциях, формально известная как лексическая область видимости, области видимости переменных и методов находятся в пределах текущей функции. «Кроме того, функции выполняются в той области, в которой они определены, а не в той, в которой они выполняются». Чтобы узнать больше об областях, ознакомьтесь с 4 паттернами проектирования Javascript, которые вы должны знать . Объект this ссылается на текущий контекст функции и используется несколькими способами.Например, его можно привязать к окну (глобально).
this.globalVar = {
myGlobalVarsMethod: function () {
}
};
console.log (this.globalVar);
И переменные могут быть привязаны к содержащей функцию, например:
this.globalVariable = 'globalVariable';
function globalFunction () {
this.innerVariable = 'внутренняя переменная';
console.log (this.globalVariable === undefined);
console.log (this.innerVariable === 'innerVariable');
возвращаться {
innerFunction: function () {
консоль.журнал (this.globalVariable === undefined);
console.log (this.innerVariable === undefined);
}
}
}
globalFunction (). innerFunction ();
С каждой вызывающей функцией привязаны отдельные объекты this. Строгий режим направлен на защиту приложений путем выдачи исключений / ошибок (TypeErrors), если переменные не определены. В производственной среде предпочтительным является строгий режим; однако я намеренно отказался от прочтения этой статьи, чтобы избежать ошибок. Вот простой пример строгого режима:
это.globalVar = 'globalVar';
function nonStrictFunctionTest () {
return function () {
console.log (this.globalVar);
}
}
function strictFunctionTest () {
'использовать строгое';
return function () {
console.log (this.globalVar);
}
}
nonStrictFunctionTest () ();
strictFunctionTest () ();
Многие разработчики Javascript не знают, что внутри функции создается объект аргументов и . Это объект , подобный массиву (имеющий только длину свойства). Аргументы имеют три основных свойства, а именно: вызываемый объект (вызывающий метод), длина и вызывающий объект (ссылка на вызываемую функцию).
Объявление переменной аргументов внутри функции заменяет / переопределяет первичный объект аргументов.
Изучите Tailwind CSS с нуля
Ниже показан объект arguments :
function fn () {
console.log (тип аргументов);
консоль.журнал (аргументы [0]);
console.log (аргументы [1]);
arguments.push ("Набу");
var arguments = "Звездные войны";
console.log (аргументы [5]);
}
fn («Звезда смерти», «Татуин»);
Чтобы создать массив с аргументами , воспользуйтесь этим маршрутом:
var args = Array.prototype.slice.call (аргументы);
И call , и apply используются для вызова метода объекта. В отличие от использования оператора точки, вызов и применяют , оба принимают , это в качестве первого аргумента.Как описано выше, каждая функция поддерживает определенную область, в которой она определена. Следовательно, вы должны учитывать область действия функции при вызове объекта.
Сигнатуры заявки и вызова Mozilla выглядят соответственно следующим образом:
fun.apply (thisArg, [argsArray])
fun.call (thisArg [, arg1 [, arg2 [, ...]]])
При явной передаче thisArg вызывающая функция может обращаться к объектам в конкретном контексте или изменять их. В следующем примере поясняется использование call .
this.lightSaberColor = 'нет';
var darthVader = {
команда: 'Империя',
lightSaberColor: 'Красный'
};
var printLightSaberColor = function () {
console.log (this.lightSaberColor);
}
printLightSaberColor ()
printLightSaberColor.call (darthVader);
printLightSaberColor.apply (darthVader);
Обратите внимание, что первый вызов по умолчанию относится к глобальной области (окну), однако второй разрешается в darthVader.
Основное различие между использованием call и apply - это их подпись. Для вызова требуется явный список аргументов, переданных отдельно, тогда как для apply требуется массив, состоящий из аргументов. Я помню это по мнемонике: « A pply использует массив A ». Применить больше подходит, когда ваша программа не знает количество аргументов.
Каррирование (приложение с частичными функциями) - это вариант использования функционального программирования для вызова и применения . Каррирование позволяет нам создавать функции, возвращающие функции, требующие подмножества аргументов с заранее определенными условиями.Вот функция каррирования:
var curry = function (fun) {
if (arguments.length & lt; 1) {
вернуть это;
}
var args = Array.prototype.slice.call (аргументы, 1);
return function () {
return fun.apply (this, args.concat (Array.prototype.slice.call (arguments, 0)));
};
};
function addOneToNumber (a) {
console.log (1 + а);
}
вар addOneCurried = карри (addOneToNumber);
console.log (addOneCurried (10));
Несмотря на то, что аргументов не является массивом, Массив.prototype.slice может преобразовывать объекты, подобные массиву, в новые массивы.
Метод bind используется для вызова методов при явном указании этого . Подобно , вызов и применяют , охват вопросов . Это полезно, когда вам нужно привязать объект к функции, этот объект .
Ниже приведена подпись , подпись :
fun.bind (thisArg [, arg1 [, arg2 [,...]]])
С точки зрения непрофессионала, мы берем функцию fun и пропускаем через нее thisArg . По сути, всякий раз, когда этот вызывается в fun , он ссылается на thisArg . Давайте подробнее рассмотрим простой пример:
var lukeSkywalker = {
мать: Падме Амидала,
отец: «Энакин Скайуокер».
}
var getFather = function () {
console.log (this.father);
}
getFather ();
getFather.bind (lukeSkywalker) ();
getFather (lukeSkywalker);
Первый getFather ()
возвращает undefined, потому что атрибут отца не установлен на на этом .Тогда что такое , это ? Это глобальный объект окна, поскольку мы не устанавливали его явно! Второй getFather ()
возвращает «Энакина Скайуокера», потому что lukeSkywalker - это getFather ()
, это , это . Многие разработчики Java / C ++ предполагают, что последний вызов getFather ()
вернет желаемый результат - хотя, опять же, этот привязан к глобальному .
Вот реализация привязки :
Функция.prototype.bind = function (scope) {
var _that = this;
return function () {
return _that.apply (область действия, аргументы);
}
}
Вследствие лексической области видимости Javascript, возвращенная функция this объект отличается от bind . Следовательно, _это установлено на * this * для поддержания правильной области. В противном случае this.apply (scope, arguments)
будет неопределенным.
Функция Javascript map - это метод функционального программирования для итерации по массиву при преобразовании каждого элемента.Он создает новый массив с «измененными» элементами, возвращаемыми в обратном вызове. Я упоминаю об изменении или преобразовании элементов, хотя, если элементы являются объектами (а не примитивами), хорошая практика диктует клонирование объекта, а не физическое изменение исходного.
Вот подпись метода:
arr.map (обратный вызов [, thisArg])
Метод обратного вызова имеет три параметра, а именно: currentValue , index и array .
Вот простой пример карты :
function Jedi (name) {
this.name = имя;
}
var kit = new Jedi («Комплект»);
var count = new Jedi ('Count');
var mace = новые джедаи («Булава»);
вар jedis = [комплект, счет, булава];
var lastNames = ['Фисто', 'Дуку', 'Винду'];
var jedisWithFullNames = jedis.map (function (currentValue, index, array) {
var clonedJedi = (JSON.parse (JSON.stringify (currentValue)))
clonedJedi.name = currentValue.name + "" + lastNames [индекс];
return clonedJedi;
});
jedisWithFullNames.map (function (currentValue) {
console.log (currentValue.name);
});
Понимая, что делает карта , взгляните на ее реализацию:
Array.prototype.map = function (fun, thisArg) {
if (typeof fun! == 'function') {
throw new Error («Первый аргумент должен иметь тип function»);
}
var arr = [];
thisArg = (thisArg)? thisArg: this;
thisArg.forEach (функция (элемент) {
arr [arr.length] = fun.call (thisArgs, элемент);
});
возврат обр;
}
* [Примечание: это простая реализация.Чтобы увидеть полную реализацию ECMAscript 5, ознакомьтесь с его спецификацией.] *
Фильтр Метод - другое поведение массива. Подобно карте , фильтр возвращает новый массив и принимает функцию и необязательный thisArg . Однако возвращаемый массив содержит только элементы, которые соответствуют определенному условию, проверенному в функции обратного вызова. Функция обратного вызова должна возвращать логическое значение - возвращение true сигнализирует о том, что элемент должен быть принят и вставлен в возвращаемый массив.
Существует множество вариантов использования фильтра , включая выбор четных целых чисел, выбор объектов с определенным свойством или выбор действительных телефонных номеров.
Вот подпись метода:
arr.filter (callback [, thisArg])
Еще раз, thisArg является необязательным, а функция обратного вызова принимает три параметра: currentValue , index и array .
Вот пример фильтра :
function Person (имя, сторона) {
это.name = name;
this.side = сторона;
}
var hanSolo = новый человек («Хан Соло», «Мятежники»);
var bobaFett = new Person ('Боба Фетт', 'Империя');
var princessLeia = new Person («Принцесса Лея», «Мятежники»);
var people = [hanSolo, bobaFett, princessLeia];
var враги = people.filter (function (currentValue, index, array) {
return currentValue.side === 'Империя';
})
.map (function (currentValue) {
console.log (currentValue.name + "борется за" + currentValue.side + ".");
});
Интересно, что методы массива объединяются в цепочку для создания забавных и сложных операций.
Наконец, давайте посмотрим на реализацию фильтра :
Array.prototype.filter = function (fun, thisArg) {
if (typeof fun! == 'function') {
throw new Error («Первый аргумент должен иметь тип function»);
}
var arr = [];
thisArg = (thisArg)? thisArg: this;
thisArg.forEach (функция (элемент) {
if (fun.call (thisArg, element)) {
arr [arr.length] = элемент;
}
});
возврат обр;
};
* [Вот спецификация реализации ECMAscript] *
Есть еще много собственных функций, которые могут оказаться полезными, хотя они и самые запутанные.Стоит просмотреть каждый метод в массивах и функциях.
Надеюсь, это дает представление о внутреннем устройстве Javascript и проясняет сбивающую с толку лексическую область видимости Javascript. Вызов, применение и привязка сложны для понимания, хотя с практикой они становятся более плавными. По возможности старайтесь реализовать карту и фильтр, избегая при этом традиционных методов зацикливания.
Понравилась эта статья?
Подпишитесь на @ devanp92 в Twitter.
.