Еще одна концепция JavaScript, которую я часто освежаю, — это this
. Поскольку this
не определяется при назначении, иногда бывает сложно точно определить, к какой области относится this
. Давайте углубимся в пример:
this.holiday = "Thanksgiving"; console.log(window.holiday) // "Thanksgiving" console.log(holiday) // "Thanksgiving"
Чтобы проанализировать использование this
, важно знать, в каком контексте он используется. Возможны два случая: глобальный контекст и контекст функции. В приведенном выше примере this
используется в глобальном контексте или контексте окна. Когда область выполнения является глобальной, а не внутри какой-либо функции, this
относится к глобальному объекту, как в приведенном выше примере.
Однако в приведенном ниже примере контекст this
меняется. При любом использовании this
внутри функции значение определяется при выполнении. Другими словами, значение this
может меняться в зависимости от того, как вызывается функция.
var length = 7; function printLength(){ console.log(this.length); } var myObj = { length: 3, method: function(anyFunction){ printLength(); arguments[0](); } } myObj.method(printLength, 1) // 7, 1
Во-первых, когда функция printLength передается в качестве параметра методу функции, областью действия this
функции printLength является окно. Переменная длина была объявлена и присвоена номеру 7 на уровне окна, к которому также можно получить доступ как к окну.длина или длина или это.длина (когда это === окно).
Метод привязан к объекту myObj, и myObj.method вызывается с параметрами printLength и 1. Хотя функция метода принимает только один аргумент, при вызове она передает два аргумента, функцию обратного вызова и число. Помните, что в JavaScript можно передавать несколько аргументов!
Когда printLength() вызывается внутри метода, который передает функцию в качестве параметра на глобальном уровне, this.length будет иметь доступ к var length = 7 (объявленному глобально), а не к length со значением 3, как определено в области видимости Object myObj .
Теперь в функциях JavaScript у нас есть доступ к любому количеству аргументов с помощью массива arguments[]. Аргумент с индексом 0 — это не что иное, как вызов первой переданной функции — printLength(). Теперь внутри printLength область действия этой функции становится массивом аргументов. Следовательно, выполнение myObj.method(printLength, 1) будет регистрировать после 7 длину аргументов, которая равна 2.
Существует несколько способов привязки контекста this
, например методы .call и .apply, метод .bind и использование стрелочных функций. Я сохраню это для другого поста в блоге :)