Tasks for learn.javascript.ru
- тег script
- внешние скрипты, порядок исполнения
- структура кода
- современный стандарт, "use strict"
- переменные
- выбор имени переменной
- шесть типов данных, typeof
- основные операторы
- операторы сравнения и логические значения
- побитовые операторы
- взаимодействие с пользователем: alert, prompt, confirm
- условные операторы: if, '?'
- логические операторы
- преобразование типов для примитивов
- циклы while, for
- конструкция switch
- функции
- функциональные выражения
- рекурсия, стек
- именованные функциональные выражения
- Введение в методы и свойства
- Числа
- В результате инициализации, к началу выполнения кода:
- Функции, объявленные как Function Declaration, создаются полностью и готовы к использованию.
- Переменные объявлены, но равны undefined. Присваивания выполнятся позже, когда выполнение дойдет до них.
- Лексическое окружение, Доступ ко внешним переменным:
- Каждая функция при создании получает ссылку [[Scope]] на объект с переменными, в контексте которого была создана.
- При запуске функции создаётся новый объект с переменными LexicalEnvironment. Он получает ссылку на внешний объект переменных из [[Scope]].
- При поиске переменных он осуществляется сначала в текущем объекте переменных, а потом – по этой ссылке.
- Замыкания:
- Все переменные и параметры функций являются свойствами объекта переменных LexicalEnvironment. Каждый запуск функции создает новый такой объект. На верхнем уровне им является «глобальный объект», в браузере – window.
- При создании функция получает системное свойство [[Scope]], которое ссылается на LexicalEnvironment, в котором она была создана.
- При вызове функции, куда бы её ни передали в коде – она будет искать переменные сначала у себя, а затем во внешних LexicalEnvironment с места своего «рождения».
- При создании функции с использованием new Function, её свойство [[Scope]] ссылается не на текущий LexicalEnvironment, а на window.
- Итого:
- Модуль при помощи замыканий – это оборачивание пакета функционала в единую внешнюю функцию, которая тут же выполняется. «Модуль» – это всего лишь функция-обёртка для скрытия переменных.
;(function() {
// code
})();
- Итого:
- Конструкция with(obj) { ... } использует obj как дополнительную область видимости. Все переменные, к которым идет обращение внутри блока, сначала ищутся в obj.
- Доступ к объекту через this
- Для доступа к текущему объекту из метода используется ключевое слово this.
- Подробнее про this
- Любая функция может иметь в себе this. Совершенно неважно, объявлена ли она в объекте или отдельно от него.
- Значение this называется контекстом вызова и будет определено в момент вызова функции.
- Значение this не зависит от того, как функция была создана, оно определяется исключительно в момент вызова.
- Итого:
- В логическом контексте объект – всегда true.
- При строковом преобразовании объекта используется его метод toString. Он должен возвращать примитивное значение, причём не обязательно именно строку.
- Для численного преобразования используется метод valueOf, который также может возвратить любое примитивное значение. У большинства объектов valueOf не работает (возвращает сам объект и потому игнорируется), при этом для численного преобразования используется toString.
- Итого:
- Любая функция может быть вызвана с
new
, при этом она получает новый пустой объект в качествеthis
, в который она добавляет свойства. Если функция не решит возвратить свой объект, то её результатом будетthis
.
- Функции, которые предназначены для создания объектов, называются конструкторами. Их названия пишут с большой буквы, чтобы отличать от обычных.
Методы и свойства, которые не привязаны к конкретному экземпляру объекта, называют «статическими». Их записывают прямо в саму функцию-конструктор.
"Фабричный статический метод" – удобная альтернатива такому конструктору. Так называется статический метод, который служит для создания новых объектов (поэтому и называется «фабричным»).
- Итого:
Статические свойства и методы объекта удобно применять в следующих случаях:
- Общие действия и подсчёты, имеющие отношения ко всем объектам данного типа. В примерах выше это подсчёт количества.
- Методы, не привязанные к конкретному объекту, например сравнение.
- Вспомогательные методы, которые полезны вне объекта, например для форматирования даты.
- Фабричные методы.
- Итого про this:
Итак, мы знаем, что
this
– это текущий объект при вызове «через точку» и новый объект при конструировании черезnew
. Значениеthis
устанавливается в зависимости от того, как вызвана функция:
- При вызове функции как метода:
obj.func(...) // this = obj
obj["func"](...)
- При обычном вызове:
func(...) // this = window (ES3) /undefined (ES5)
- В
new
:
new func() // this = {} (новый объект)
- Явное указание:
func.apply(context, args) // this = context (явная передача)
func.call(context, arg1, arg2, ...)