【问题标题】:Why Javascript import function returns undefined为什么Javascript导入函数返回未定义
【发布时间】:2021-07-18 10:36:35
【问题描述】:

我想了解更多关于 javascript 引用范围的信息,我试图从类似这样的另一个文件中导入一个函数

file1.js

exports.checkIfCan = function(){
 //make some check
}

exports.calculate = function(){
   this.checkIfCan();
}

并在此导入中使用计算方法

file2.js

const { calculate } = require('./file1.js')

calculate()

其实错误是this.checkIfCan is not a function 但是如果我像这样导入所有模块,它就可以工作

const calculation = require('./file1.js')

calculation.calculate();

我只是想了解更多关于 javascript 中的全局/本地范围

【问题讨论】:

  • 您需要改为检查课程。您想创建一个带有函数的对象。检查这个:stackoverflow.com/questions/5334383/…
  • 我没有收到任何错误,您的两个案例都适用于我的案例....大声笑
  • exports.calculate = () => { 肯定使用箭头函数,而不是exports.calculate = function() {。您的错误似乎表明您没有使用箭头函数
  • @NickParsons 你是对的,我没有使用箭头功能,但为什么它应该使用?
  • @VladVlads this 关键字在箭头函数中的作用与在常规函数中的作用略有不同。

标签: javascript node.js module scope


【解决方案1】:

this 指的是函数调用的上下文,在你的例子中是undefined(在浏览器上默认是window)。

这里有一个尽可能简单的例子让你理解它:

calculation.calculate(); // <= you are calling calculate from calculation, so 'this' is calculation

calculate(); // <= you are calling calculate from... nothing, so 'this' is undefined

更新:使用箭头函数在任何一种情况下都可以工作,因为 this 将取自函数的周围范围而不是上下文,并且在 Node 模块的顶级代码中 this 等效于 module.exports .

关于thisin javascript 有很多要解释的地方,我可以建议您阅读免费电子书You Don't Know JS: this and Object prototypes 吗?您会在那里找到更多信息。

【讨论】:

  • 如果 OP 使用常规函数就会出现这种情况,但由于 OP 使用箭头函数,this 将取自周围范围,而不是基于函数的调用方式。跨度>
  • @NickParsons 太失败了!你是对的,我什至没有正确阅读它。我会改进我的答案或将其删除,谢谢指出
  • 不用担心。但看起来 OP 已经更新了他们的答案,所以你的答案现在很好?
  • 这很好,但我仍然添加了一些关于箭头函数和节点的指示。希望可以理解?
【解决方案2】:

@Vlad Vlads,您的问题在于您的文件 file1.js 中使用了关键字 this

根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this,可能会出现以下行为:

this 的值由 如何 函数 决定 调用 (运行时绑定)。期间不能通过赋值设置 执行,并且每次函数调用时可能不同

话虽如此,如果您在函数中删除关键字 this,以下将按预期工作:

const { calculate } = require('./file1.js')

calculate()

您的第二个示例也将按预期工作

const calculation = require('./file1.js')

calculation.calculate()

【讨论】:

    【解决方案3】:

    你应该使用 import 代替:

    file1.js

    function abc() {}
    
    export {
       abc
    }
    

    file2.js

    import { abc } from 'file1.js';
    abc();
    

    【讨论】:

    • import 是 ES6 模块语法,OP 在这里没有使用。 require()module.exports 适用于 CommonJS 模块,这就是 OP 在这里使用的。
    • 也许他在用,你不知道。如果他碰巧在他标记的 node.js 或 React、Vue 或 Angular 等框架中使用它,则支持使用导入,这是未来的发展方向。你不能就这样投反对票。
    • ES6 模块中不存在导出对象,因此如果 OP 正在使用它,那么他们会收到其他错误。因为值得反对的不是我的投票
    猜你喜欢
    • 2013-04-08
    • 2021-11-15
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多