为什么从同一个javascript文件导入和导出时会出现类型非函数错误?

为什么从同一个javascript文件导入和导出时会出现类型非函数错误?,javascript,node.js,Javascript,Node.js,假设我有以下两个Javascript文件: 1) 文件1: 2) 文件2: 如果运行file1,则会出现以下错误: TypeError: fun1 is not a function TypeError: fun2 is not a function 如果运行file2,则会出现以下错误: TypeError: fun1 is not a function TypeError: fun2 is not a function 从同一文件导入和导出到同一文件有什么问题?有解决办法吗?我正在使

假设我有以下两个Javascript文件:

1) 文件1:

2) 文件2:

如果运行file1,则会出现以下错误:

TypeError: fun1 is not a function
TypeError: fun2 is not a function
如果运行file2,则会出现以下错误:

TypeError: fun1 is not a function
TypeError: fun2 is not a function

从同一文件导入和导出到同一文件有什么问题?有解决办法吗?我正在使用NodeJS

发生这种情况的原因是fun2是一个如下所示的对象:

{
    fun2: function(){
        return "xyz";
    };
}
当您将东西从file2导入file1时,您不仅仅是导入fun2函数。您正在导入一个包含
fun2
函数的对象

可能的解决方案 有很多不同的方法来解决这个问题

  • file1
  • 改为做类似的事情

    console.log(fun2.fun2());
    
  • 只需要
    fun2
    功能。 需要该模块时,只需使用该模块的
    fun2
    功能即可
  • 仅导出
    file2
    不要执行
    exports.fun2=(此处插入函数)
    ,而是执行
    module.exports=(此处插入函数)
    。这将只导出
    fun2
    函数,因此当您执行
    require('./file1')
    时,它将为您提供一个
    函数
  • 试一试


    这称为循环依赖。要解决此问题,请尝试以下操作

    // file 1
    exports.fun1 = () => {
      return "abc";
    };
    
    const { fun2 } = require("./file2");
    console.log(fun2());
    


    谢谢你的意见。唯一有效的解决方案是第三个,但我不能使用它,因为我需要导出多个函数,而不是一个,因此无法将其直接添加为唯一导出。这只是一个简化的演示。其他解决方案也会出现同样的错误。在测试后,即使第三种解决方案也不起作用。这两种解决方案都不能解决问题。我甚至不确定你的解释是否正确。
    const{fun2}=require('./file2')做什么?我不使用
    fun2
    周围的括号。尝试与我的答案中的任一解决方案一起执行此操作:
    constfun2=require('./file2')(不带括号)如果我有多个函数要导出怎么办?这只是脚本的简化版本,实际上是一个完全不相关的答案!我的语法是正确的,所以语法不是问题。你是正确的,这是一个循环依赖,但这不是问题的根本原因。根本原因,正如@programmerRaj的答案中已经解释的,是导出是一个包含函数的对象,而不仅仅是函数本身。@EJK将导出设置为函数本身不会有帮助。@EJK这里的答案不会更改导出的对象或循环依赖项,它只是修正了语句的求值顺序。它有效,是正确的解决方案。不过,可能需要对这个问题进行更好的解释。@EJK我了解到,应该尽可能避免循环依赖,因为它们表明代码设计不好。我的真实代码有一个模型/控制器设计。我可以通过将两个函数都放在同一个模块中来避免这种循环现象,该模块在实际代码中是控制器,但导入的函数属于另一个模型。在MVC中,从另一个控制器控制模型的某些功能是可以的,还是不好的做法?@MichaelSamuel当然,最好完全避免循环依赖,但有时有很好的理由这样做。我们无法判断您的用例。如果您的代码中确实有一个模块,那么您只需要确保在两个模块完成其所有功能的导出之前,您从未使用/访问任何导出。这包括函数调用和分解。请确保。在定义函数之前,您正在调用该函数。
    
    exports.fun1 = function() {
       return 'abc';
    };
    
    // file 1
    exports.fun1 = () => {
      return "abc";
    };
    
    const { fun2 } = require("./file2");
    console.log(fun2());
    
    // file 2
    exports.fun2 = () => {
      return "xyz";
    };
    
    const { fun1 } = require("./file1");
    console.log(fun1());