如何从模块中的另一个函数中调用一个函数。出口报关吗?

app.js
var bla = require('./bla.js');
console.log(bla.bar());
bla.js
module.exports = {

  foo: function (req, res, next) {
    return ('foo');
  },

  bar: function(req, res, next) {
    this.foo();
  }

}

我试图从函数栏中访问函数foo,我得到:

TypeError: Object #没有foo方法

如果我将this.foo()更改为foo(),我得到:

引用错误:foo没有定义


当前回答

如果您这样做,您将在调用函数中丢失this对象引用。 如:

    module.exports.a = function () {
      return true
    }
    
    module.exports.b = function() {
      return this.a();
    }

这里你会遇到问题,因为当你调用this.a()时,它引用的是b函数的this对象。

要解决这个问题,你必须把this对象引用存储在某个地方或者使用箭头函数,因为箭头函数没有这个对象所以它总是引用外部的this对象

为了解决这个问题,像这样修改函数

    module.exports.a = function () {
      return true
    }
    
    module.exports.b = () => {
      return this.a();
    }

其他回答

你可以在模块外部声明你的函数。出口。

var foo = function (req, res, next) {
  return ('foo');
}

var bar = function (req, res, next) {
  return foo();
}

然后:

module.exports = {
  foo: foo,
  bar: bar
}

如果您这样做,您将在调用函数中丢失this对象引用。 如:

    module.exports.a = function () {
      return true
    }
    
    module.exports.b = function() {
      return this.a();
    }

这里你会遇到问题,因为当你调用this.a()时,它引用的是b函数的this对象。

要解决这个问题,你必须把this对象引用存储在某个地方或者使用箭头函数,因为箭头函数没有这个对象所以它总是引用外部的this对象

为了解决这个问题,像这样修改函数

    module.exports.a = function () {
      return true
    }
    
    module.exports.b = () => {
      return this.a();
    }

另一种更接近OP原始风格的方法是,将想要导出的对象放入一个变量中,并引用该变量来调用对象中的其他方法。然后就可以导出这个变量了。

var self = {
  foo: function (req, res, next) {
    return ('foo');
  },
  bar: function (req, res, next) {
    return self.foo();
  }
};
module.exports = self;
const Service = {
  foo: (a, b) => a + b,
  bar: (a, b) => Service.foo(a, b) * b
}

module.exports = Service

我所做的是创建一个独立的foo函数,并在两个地方引用它。

这样,无论使用箭头还是常规函数,都可以避免任何问题

function foo(req,res,next) {
  return ('foo');
}

然后我可以在这两个地方引用foo

module.exports = {

  foo, // ES6 for foo:foo

  bar: function(req, res, next) {
    foo();
  }

}