Я пытаюсь сделать что-то довольно простое:
У меня есть функция, которая является частью класса, в функции я вызываю
async, и я использую синтаксис .then для прослушивания его завершения. я
затем используйте стрелку для выполнения действия.
Здесь что-то идет не так, внутри моей стрелочной функции this
не определено в соответствии с отладчиком VS Code. Но this определяется в функции
(write(document)), содержащий стрелочную функцию.
Вот код для этого:
const fs = require('mz/fs');
const path = require('path');
class DB {
constructor(name) {
this.db = path.normalize("./");
}
write(document) {
const dir = path.normalize(this.db + "/" + document);
fs.exists(dir).then((exists) => {
console.info(this); // ADDED THIS IN EDIT.
if (!exists) {
return fs.mkdir(dir)
} else {
return new Promise();
}
}).then(() => {
const file = path.normalize(dir + "/" + document + ".json");
fs.readFile(file, (err) => {
console.info(err);
});
});
}
}
Я думал, что прочитал, что функция стрелки автоматически связывает this из области, в которой определена функция стрелки. Но, может быть, я неправильно понял? Я работаю в основном с Dart, в котором правила области видимости не такие сложные, так что, возможно, я что-то путаю с Dart?
--РЕДАКТИРОВАТЬ--
Извините за путаницу, мне на самом деле не нужен this в моей стрелочной функции, но я был просто удивлен, что отладчик VS Code показал его как undefined. Теперь я добавил консольный журнал в функцию стрелки, и, по-видимому, он определен! Возможно, что-то не так с отладчиком VS Code Node? Так что, в конце концов, похоже, что с кодом проблем нет ...

«Здесь что-то идет не так…» - Вы обозначили это как цитату. Кого вы цитируете? Если это не цитата, не используйте разметку цитаты.
@Quentin Мне на самом деле не нужен this ни в одной из стрелочных функций, но после отладки я обнаружил, что this по какой-то причине не определен в их области действия. Итак, я хотел бы знать, почему это так.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


У вас есть три разные стрелочные функции, и ни одна из них не пытается использовать this.
I actually do not need this in any of the arrow functions, but upon debugging I found that this is undefined in their scope for some reason.
Это оптимизация производительности.
Если переменная не используется в функции, она не будет существовать в этой функции, даже если в противном случае она была бы в области видимости.
Это позволяет, например:
function foo () {
var bar = something_that_returns_a_memory_intensive_object()
return () => console.info(1);
}
const baz = foo();
После того, как foo завершит работу и вернет свою функцию, bar (и большой объект) могут быть удалены сборщиком мусора.
То же самое и с this.
I now added a console log in the arrow function and apparently it is defined!
… И когда вы его используете, переменная закрывается и становится доступной.
«Если переменная не используется в функции, она не будет существовать в этой функции, даже если в противном случае она была бы в области видимости». Я не знал, что! В любом случае, я добавил console.info(this), так что, думаю, он используется сейчас. console.info() распечатывает фактический объект, как и предполагалось, НО отладчик VS Code по-прежнему показывает this как undefined. Это ожидаемое поведение?
@BramVanbilsen - Я не ожидал такого поведения, но я могу его воспроизвести.
У вас есть три разные стрелочные функции, и ни одна из них не пытается использовать
this. Действительно непонятно, о чем вы спрашиваете.