Найти в Дзене
Рекурсия/Рекурсивный процесс и итеративный процесс
Рекурсия vs. какой-то процесс Давайте для начала явно отметим отличие рекурсии (в общем смысле) от процесса. Эти понятия никак не связаны. Рекурсия — просто абстрактная концепция, которую можно наблюдать в природе, которая используется в математике и в других областях. Такая же абстрактная, как, например, музыкальная гармония. Теперь на секунду забудем про рекурсию, и просто подумаем про компьютеры. Для выполнения задач компьютерам нужны инструкции. Когда компьютер выполняет набор инструкций — это процесс...
5 лет назад
JavaScript/Замыкание
Возможность использовать вызовы функций как переменные вкупе с тем фактом, что локальные переменные каждый раз при вызове функции создаются заново, приводит нас к интересному вопросу. Что происходит с локальными переменными, когда функция перестаёт работать? Следующий пример иллюстрирует этот вопрос. В нём объявляется функция wrapValue, которая создаёт локальную переменную. Затем она возвращает функцию, которая читает эту локальную переменную и возвращает её значение. function wrapValue(n) { ...
5 лет назад
JavaScript/Стек вызовов
Будет полезно взглянуть на то, как порядок выполнения работает с функциями. Вот простая программа с несколькими вызовами функций: function greet(who) { console.log("Привет, " + who); } greet("Семен"); console.log("Покеда"); Обрабатывается она примерно так: вызов greet заставляет проход прыгнуть на начало функции. Он вызывает встроенную функцию console.log, которая перехватывает контроль, делает своё дело и возвращает контроль. Потом он доходит до конца greet, и возвращается к месту, откуда его вызвали...
5 лет назад
JavaScript/Короткое вычисление логических операторов
Логические операторы && и || работают с величинами разных типов очень странным образом. Они преобразуют величину с левой стороны оператора в булевскую, чтобы понять, что делать дальше, но в зависимости от оператора и от результата этого преобразования, возвращают оригинальное значение либо левой, либо правой части. К примеру, || вернёт значение с левой части, когда его можно преобразовать в true – а иначе вернёт правую часть. console.log(null || "user") // → user console.log("Karl" || "user") // → Karl Такая работа оператора || позволяет использовать его как откат к значению по умолчанию...
5 лет назад
JavaScript/Автоматическое преобразование типов
JavaScript позволяет выполнять любые, подчас очень странные инструкции. К примеру: console.log(8 * null) // → 0 console.log("5" - 1) // → 4 console.log("5" + 1) // → 51 console.log("пять" * 2) // → NaN console.log (false == 0) // → true Когда оператор применяется «не к тому» типу величин, JavaScript втихую преобразовывает величину к нужному типу, используя набор правил, которые не всегда соответствуют вашим ожиданиям. Это называется приведением типов (coercion). В первом выражении null превращается в 0, а “5” становится 5 (из строки – в число)...
5 лет назад
JavaScript/Всплытие
Всплытие или Hoisting - это способность интерпретатора знать о функциях или переменных еще до того, как они будут объявлены. Посмотрим пример: function sum( ) { return a + b; } var a = 10; var b = 10; sum( ); // вернет 20 Объявляется функция, которая использует переменные a и b еще до того, как они были объявлены. Чтобы понять почему такой код работает, можно представить себе, что перед выполнением кода, интерпретатор сканирует код на предмет переменных и перемещает их объявление в начало их областей видимости...
5 лет назад
JavaScript/IIFE
Immediately-invoked function expression - это тип вызова функции при котором функция вызывается сразу же после объявления. Для этого используется такой шаблон: (function(параметры) {код функции})(аргументы); Посмотрим на пример: (function(a, b) { console...
5 лет назад
Возврат функций
Кстати, еще одна интересная особенность функции заключается в том, что она может не только принимать другую функцию в качестве параметра, но и возвращать функцию при помощи все того же оператора return: function func1( ) { var a = 10; return function( ) { return a + 100; } } var f = func1( ); console.log(f( )) // выведется 110 Здесь объявлена функция func1, внутри которой объявлена переменная a. Соответственно, переменная a является частью области видимости функции func1...
5 лет назад
JavaScript/Анонимные функции
При использовании function expression задавать имя функции не обязательно. Это может быть в тех случаях, когда мы попросту не используем имя функции. Например - передача одной функции в качестве аргумента в другую: function callFunction(fn) { var r = fn(); console.log('Результат работы функции:', r); } callFunction(function() { return 10 + 10; }); Объявлена функция callFunction, которая имеет параметр с именем fn. Задача callFunction - принять функция в качестве аргумента, выполнить эту функцию и вывести результат ее выполнения в консоль...
5 лет назад
JavaScript/Замыкание
Замыкание - это способность функции запоминать область видимости, в которой эта функция была объявлена. Посмотрим пример: var b = 10; function func(a) { var с = 100; return a + b + с; } func(1); Переменная a является параметром функции func, а параметры функции всегда входят в область видимости функции, соответственно, переменная a свободно используется внутри func и недоступна извне. Переменная b объявлена в глобальной области видимости. Функция func тоже объявлена в глобальной области видимости...
5 лет назад
JavaScript/Область видимости
Область видимости или scope - это отрезок кода, в пределах которого мы имеем доступ к какой-либо переменной. Каждая функция имеет свою область видимости: function func(a) { var b = 10; return a + b; } Здесь объявляется функция с именем func, которая принимает 1 параметр - a. Внутри функции объявляется переменная b. То, что создано внутри функции - является частью области видимости этой функции и не может быть использовано вне этой функции...
5 лет назад
JavaScript/Типы объявления функций
Существует два способа объявления функций: Function Expression и Function Declaration. Более глобальную разницу между ними мы рассмотрим позже, а пока посмотрим на два примера: Function Declaration: function sum(a, b) { return a + b; } Function Expression: var sum = function(a, b) { return a + b; }; Исходя из приведенных примеров, в случае с Function Declaration, интерпретатор объявляет переменную с именем функции и присваивает ей описание функции. В случае с Function Expression - мы сами объявляем переменную с именем функции и присваиваем ей описание функции...
5 лет назад