在胖箭头函数中未定义,但在封闭范围内定义

时间:2018-08-22 11:55:13

标签: javascript node.js ecmascript-6 es6-promise

我正在尝试做一些相当简单的事情:

我有一个属于类的函数,在该函数中,我称之为 异步方法,我使用.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.log(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.log(err);
            });
        });
    }
}

我认为已经阅读到箭头功能会自动将this绑定到定义的箭头功能所在的范围。但是也许我误会了?我主要在Dart工作,因为它的范围规则不是那么复杂,所以也许我在Dart中混了些东西?

-编辑- 抱歉,我实际上不需要我的箭头函数this,但感到惊讶的是VS Code调试器将其显示为undefined。现在,我在箭头功能中添加了一个控制台日志,显然它已定义!因此,VS代码节点调试器可能有问题吗?毕竟,无论如何代码似乎都没有问题…… enter image description here

1 个答案:

答案 0 :(得分:1)

您有三种不同的箭头功能,但没有一个尝试使用this

  

实际上我不需要任何箭头功能,但是在调试时,由于某种原因,我发现这在它们的作用域中是未定义的。

这是性能优化。

如果某个变量未在函数中使用,则该变量将不存在于该函数中,即使它在范围内也是如此。

例如,这允许:

function foo () {
    var bar = something_that_returns_a_memory_intensive_object()
    return () => console.log(1);
}

const baz = foo();

foo完成运行并返回其功能后,可以bar(和大对象)进行垃圾回收。

this也是如此。

  

我现在在箭头功能中添加了控制台日志,显然它已定义!

…,当您使用它时,该变量将被关闭并可用。