CommonJS 模块中的公开成员和私有/本地成员

问题描述 投票:0回答:1

我正在测试这个框架并遇到了这些问题,我不知道为什么会发生这些问题,但在 Node.js 文档和全局搜索中都找不到答案。

init.js

const { f1, v1, v2, f2 } = require('./1.js')

f2()

1.js

module.exports = {
    
    f1: function (v1) { f1(v1) },
    
    v1: 1,
    v2: this.v1 + 1,
    
    f2: function () { f1(this.v2) },
    // * error: outputs NaN .
    
    // f2: function () { this.f1(this.v2) },
    // * error: when called from importing script, crashes with `TypeError: this.f1 is not a function` .
    //  
    //  This function works if `<<name for Object>> = require('<<path>>')` syntax is used .
    
}

function f1 (v1) {
    console.log(v1)
}

具体问题是:

  • 如何在其他暴露函数中使用暴露函数和变量?

    是否可以使用

    module.exports = {
    语法来实现?

javascript node.js node-modules commonjs
1个回答
0
投票

如果您想保留定义

module.exports
对象内部所有内容的语法,您可以通过
this
或通过
module.exports
:

在其他函数体内引用它
module.exports = {
  f1: function () {
    // …
  },

  f2: function () {
    this.f1()
  },

  f3: function () {
    module.exports.f1()
  },
}

对于变量(非函数属性),不能通过

module.exports
来引用对象。这是因为在计算属性值时,
module.exports
还不存在。

你也不能用

this
来引用它,主要是出于同样的原因:
this
指的是不同的事物,而不是对象。


如果您单独定义事物并导出它们,那么所有这些麻烦都可以轻松避免(还有额外的好处,例如使值只读、更细粒度的可见性控制等等):

const v1 = 1

let v2 = v1 + 1

function f1(arg) {
  console.log(arg)
}

function f2() {
  f1(v2)
}

module.exports = { v1, v2, f1, f2 }
© www.soinside.com 2019 - 2024. All rights reserved.