Для того чтобы предоставить общую картину, я собираюсь объяснить как динамическую, так и лексическую привязку.
Динамическое связывание Имя
this
относится к объекту метод вызывается. Это регулярно читаемое предложение на SO. Но это все еще только фраза, довольно абстрактная. Есть ли соответствующий шаблон кода для этого предложения?
Да есть:
const o = {
m() { console.log(this) }
}
// the important patterns: applying methods
o.m(); // logs o
o["m"](); // logs o
m
является метод, поскольку он опирается на this
. o.m()
или o["m"]()
означает, что m
применяется к o
. Эти шаблоны - это перевод Javascript на нашу знаменитую фразу.
Существует еще один важный шаблон кода, который вы должны обратить внимание на:
"use strict";
const o = {
m() { console.log(this) }
}
// m is passed to f as a callback
function f(m) { m() }
// another important pattern: passing methods
f(o.m); // logs undefined
f(o["m"]); // logs undefined
Он очень похож на предыдущий образец, только круглые скобки отсутствуют. Но последствия значительны: когда вы передаете m
функции f
, вы вытаскиваете m
своего объекта/контекста o
. Теперь он выкорчеван и this
ничего не говорит (предполагается строгий режим).
лексические (или статический) Имя Binding
функции стрелки не имеют свои собственные this
/super
/arguments
переплета. Они наследуют их от родительского лексической области:
const toString = Object.prototype.toString;
const o = {
foo:() => console.log("window", toString.call(this)),
bar() {
const baz =() => console.log("o", toString.call(this));
baz();
}
}
o.foo() // logs window [object Window]
o.bar() // logs o [object Object]
Помимо глобальной области (Window
в браузерах) только функции способны сформировать область в JavaScript (и {}
блоков в ES2015).Когда вызывается функция стрелки o.foo
, нет никакой функции, из которой baz
может наследовать ее this
. Следовательно, он фиксирует привязку глобальной области действия, которая привязана к объекту Window
.
Когда baz
вызывается o.bar
, функция стрелки окружена o.bar
(o.bar
формирует свою родительскую лексическую область) и может наследовать o.bar
«ы this
связывания. o.bar
был вызван на o
и, следовательно, его this
связан с o
.
Он просто фиксирует значение 'this' от объема, содержащего, рассматривая его как любой переменная. – Barmar
Это просто значит, что вам не нужно делать kludge из 'var self = this;', а затем использовать 'self' в функции. – Barmar
В вашем случае нет закрывающего контекста, или это глобальный контекст или контекст модуля, поэтому 'this' - это то, что в этом случае, скорее всего, null или window. Другими словами, 'this' имеет точно такое же значение, как если бы вы добавили' console.log (this) 'перед назначением функции. –