【问题标题】:This undefined in fat arrow function but is defined in the enclosing scope这在胖箭头函数中未定义,但在封闭范围内定义
【发布时间】:2018-08-22 11:55:13
【问题描述】:

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

我有一个属于类的函数,在函数中我调用了 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.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 Code Node 调试器可能有问题?所以毕竟,无论如何,代码似乎没有问题......

【问题讨论】:

  • 你有三个不同的箭头函数,它们都没有尝试使用this。真的不清楚你在问什么。
  • “这是出了问题的地方……” — 您已将此标记为引用。你在引用谁?如果不是引号,请不要使用引号标记。
  • @Quentin 实际上我在任何箭头函数中都不需要this,但在调试时我发现this 由于某种原因在其范围内未定义。所以我想知道为什么会这样。

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


【解决方案1】:

您有三个不同的箭头函数,它们都没有尝试使用this

我实际上在任何箭头函数中都不需要这个,但是在调试时我发现由于某种原因它在它们的范围内是未定义的。

这是一个性能优化。

如果一个变量没有在函数中使用,那么它就不会存在于该函数中,即使它在范围内也是如此。

这允许,例如:

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

const baz = foo();

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

this也是如此。

我现在在箭头函数中添加了一个控制台日志,显然它已定义!

…当你使用它时,变量被关闭并可用。

【讨论】:

  • "如果一个变量没有在函数中使用,那么它就不会存在于该函数中,即使它在范围内也是如此。"我不知道!无论如何,我添加了console.log(this) 所以我猜它现在已经被使用了。 console.log() 打印出实际对象,因为它应该是,但是 VS Code 调试器仍将 this 显示为 undefined。这是预期的行为吗?
  • @BramVanbilsen — 这不是我所期望的行为,但我可以重现它。
猜你喜欢
  • 2016-11-30
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 2016-11-22
相关资源
最近更新 更多