我正在尝试做一些相当简单的事情:
我有一个属于类的函数,在该函数中,我称之为
异步方法,我使用.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代码节点调试器可能有问题吗?毕竟,无论如何代码似乎都没有问题……
答案 0 :(得分:1)
您有三种不同的箭头功能,但没有一个尝试使用this
。
实际上我不需要任何箭头功能,但是在调试时,由于某种原因,我发现这在它们的作用域中是未定义的。
这是性能优化。
如果某个变量未在函数中使用,则该变量将不存在于该函数中,即使它在范围内也是如此。
例如,这允许:
function foo () {
var bar = something_that_returns_a_memory_intensive_object()
return () => console.log(1);
}
const baz = foo();
foo
完成运行并返回其功能后,可以bar
(和大对象)进行垃圾回收。
this
也是如此。
我现在在箭头功能中添加了控制台日志,显然它已定义!
…,当您使用它时,该变量将被关闭并可用。