Суть вашего недоразумения заключается в следующем:
, что в функциях жирной стрелки есть область непосредственного объекта
Неверно.Его контекст разрешен в области выполняемой в данный момент функции / среды.
Примеры:
// global scope outside of any function:
let foo = {};
// Define a method in global scope (outside of any function)
foo.a = () => {
console.log(this); // undefined
}
// Return a function from scope of a method:
foo.b = function () {
// remember, "this" in here is "foo"
return () => {
console.log(this); // foo - because we are in scope foo.c()
}
}
foo.a(); // undefined
foo.b()(); // foo
Для функций со стрелками важен не тот объект, к которому принадлежит функция, а то, гдеопределено.Во втором примере функция может совершенно не принадлежать foo
, но все равно будет печатать foo
независимо от:
bar = {};
bar.b = foo.b();
bar.b(); // will log "foo" instead of "bar"
Это противоположно обычным функциям, которые зависят от того, как вы их вызываете, вместо того, гдеВы определяете их:
// Defined in global scope:
function c () {
console.log(this);
}
bar.c = c;
bar.c(); // will log "bar" instead of undefined because of how you call it
Примечание
Обратите внимание, что здесь есть две совершенно разные концепции, которые смешаны - context (какое значение имеет this)) и scope (какие переменные видны внутри функции).Функция стрелки использует область видимости для разрешения контекста.Обычные функции не используют объем, но вместо этого зависят от того, как вы их называете.
Вопросы
Теперь, чтобы ответить на некоторые ваши вопросы:
- В этомслучай, какова область этого в толстых стрелках?
Как я уже сказал. Scope и this являются двумя несвязанными понятиями.Концепция this - это объект / экземпляр context - то есть, когда вызывается метод, на какой объект действует метод.Понятие scope так же просто, как и то, что представляют собой глобальные переменные и какие переменные существуют только внутри конкретной функции, и может развиться в более сложные понятия, такие как замыкания .
Таким образом, поскольку scope всегда одно и то же, единственное отличие заключается в функциях со стрелками, его контекст (его this ) определяется областью действия.То есть когда функция объявляется, где она объявляется?В корне файла?Тогда он имеет глобальную область видимости и это равно "undefined"
.Внутри другая функция?Тогда это зависит от того, как эта функция вызывается.Если он был вызван как метод объекта, такого как UserSchema.methods
, например, если UserSchema.methods.generatePasswordSetter()
возвращает функцию стрелки, то эта функция (назовем ее setPassword()
) будет иметь эту точку направильный объект.
Какова область этого в нормальных определениях функций?
Исходя из моего объяснения выше, я могу только сказать, что область действия не связана со значением this
внормальные функции.Более подробное объяснение того, как работает this
, смотрите в моем ответе на этот другой вопрос: Как ключевое слово "this" в Javascript действует внутри литерала объекта?
Как получить доступ к объекту, в этом случае: UserSchema, свойства (простите за менее правильные слова) в функциях жирной стрелки, как в обычных определениях функций?
Способэто определено, это невозможно.Вы должны определить его из обычной функции, которая имеет this
, указывающую на UserSchema
:
UserSchema.methods.generatePasswordSetter = function () {
return (password) => { /* implementation... */}
}
Но это, вероятно, не то, что вы хотите.Чтобы сделать то, что вы хотите, вам нужно всего лишь прекратить использование функций стрелок в этом случае.Регулярные функции все еще существуют для таких вариантов использования, как этот.