好的,所以...我从一个文件夹加载了几个文件,并希望将加载文件中的功能加载到加载文件的文件中。好像它们从一开始就在文件中一样。
到目前为止,我当前的代码运行良好,但是我不能在加载的函数中使用“ this”,因为它不是加载函数的文件中的“ this”。
加载所有文件并包括其功能。
return fs.readdirAsync(path.join(__dirname, 'Handlers')).map(file => {
if (file.substr(file.length - 3) === '.js') {
let handlerFile = require(path.join(__dirname, 'Handlers', file))
for (const handlerName of Object.keys(handlerFile)) {
this[handlerName] = handlerFile[handlerName]
}
}
})
这是加载文件的样子:
module.exports = {
test: (arguments) => {
console.log(this)
}
}
因此,如果我现在在加载该函数的文件中调用this.test(),则会执行 console.log(this)。到目前为止,一切正常,但是“ this”是空的。
是否有一种方法可以使加载的函数从加载函数的文件中获取“ this”? (不将其传递给函数)
我希望你理解我想要的。感谢您的帮助。
答案 0 :(得分:0)
this
的值不会自动从您的原始环境传递到已加载的模块。当模块加载了require()
时,该模块中this
的值将设置为module.exports
的值,并且由于您的test()
方法是使用箭头函数声明的, .test()
方法内部的this的值将是this
的词法值,在您向我展示的代码中,它将是module.exports
的原始值(在您重新分配它之前) ),因为this
是最初加载模块时的状态。
如果您使用类似.test()
之类的方法来调用this.test()
方法,那么一个非常简单的解决方法是停止对方法使用箭头函数并使用常规函数。在obj.test()
中称为方法的常规函数会将方法中的this
的值设置为obj
。如果那是您想要的,那就停止使用箭头功能。实际上,在极少数情况下,您希望使用箭头函数声明方法。方法几乎应该总是正常的函数定义。请记住,箭头功能不仅仅是快捷方式语法。它会更改设置this
的值的行为。
因此,您可以将加载的文件更改为此:
module.exports = {
test: function(args) {
console.log(this)
}
}