Это не определено в функции жирной стрелки, но определено в охватывающей области

Я пытаюсь сделать что-то довольно простое:

У меня есть функция, которая является частью класса, в функции я вызываю 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? Так что, в конце концов, похоже, что с кодом проблем нет ... Это не определено в функции жирной стрелки, но определено в охватывающей области

У вас есть три разные стрелочные функции, и ни одна из них не пытается использовать this. Действительно непонятно, о чем вы спрашиваете.

Quentin 22.08.2018 14:04

«Здесь что-то идет не так…» - Вы обозначили это как цитату. Кого вы цитируете? Если это не цитата, не используйте разметку цитаты.

Quentin 22.08.2018 14:06

@Quentin Мне на самом деле не нужен this ни в одной из стрелочных функций, но после отладки я обнаружил, что this по какой-то причине не определен в их области действия. Итак, я хотел бы знать, почему это так.

Bram Vanbilsen 22.08.2018 14:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
617
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть три разные стрелочные функции, и ни одна из них не пытается использовать 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. Это ожидаемое поведение?

Bram Vanbilsen 22.08.2018 14:37

@BramVanbilsen - Я не ожидал такого поведения, но я могу его воспроизвести.

Quentin 22.08.2018 14:40

Другие вопросы по теме