ES6 导出默认值,多个函数相互引用

2022-08-30 05:41:15

在es6中,您可以定义一个这样的函数模块

export default {
    foo() { console.log('foo') }, 
    bar() { console.log('bar') },
    baz() { foo(); bar() }
}

以上似乎是有效的代码,但是如果我调用它,则会引发错误:baz()

ReferenceError: foo is not defined

如何从另一个函数调用?在这种情况下foobaz

编辑

下面是实际上不起作用的代码。我已经简化了代码,因此它只是所需的核心

const tokenManager =  {
  revokeToken(headers) { 
    ... 
  },
  expireToken(headers) {
    ...
  },
  verifyToken(req, res, next) {
    jwt.verify(... => {
      if (err) {
        expireToken(req.headers)
      }
    })
  }
}

export default tokenManager 

并且错误是

expireToken(req.headers);
        ^
ReferenceError: expireToken is not defined

编辑 2

我之前刚刚尝试过添加,它终于可以工作了tokenManagerexpireToken


答案 1

构造只是类似这样的捷径:export default {...}

const funcs = {
    foo() { console.log('foo') }, 
    bar() { console.log('bar') },
    baz() { foo(); bar() }
}

export default funcs

现在必须变得很明显,在模块的范围内没有 或函数。但是有一个名为(尽管实际上它没有名称)的对象包含这些函数作为其属性,它将成为模块的默认导出。foobarbazfuncs

因此,要修复您的代码,请在不使用快捷方式的情况下重写它,并引用 和 作为 的属性:foobarfuncs

const funcs = {
    foo() { console.log('foo') }, 
    bar() { console.log('bar') },
    baz() { funcs.foo(); funcs.bar() } // here is the fix
}

export default funcs

另一种选择是使用关键字来引用对象,而不必显式声明它,正如@pawel所指出的那样thisfuncs

另一种选择(也是我通常更喜欢的选项)是在模块范围内声明这些函数。这允许直接引用它们:

function foo() { console.log('foo') }
function bar() { console.log('bar') }
function baz() { foo(); bar() }

export default {foo, bar, baz}

如果您想要默认导出的便利性和单独导入项目的能力,您还可以单独导出所有功能:

// util.js

export function foo() { console.log('foo') }
export function bar() { console.log('bar') }
export function baz() { foo(); bar() }

export default {foo, bar, baz}

// a.js, using default export

import util from './util'
util.foo()

// b.js, using named exports

import {bar} from './util'
bar()

或者,正如@loganfsmyth建议的那样,您可以在没有默认导出的情况下进行操作,而只使用在一个对象中获取所有命名导出。import * as util from './util'


答案 2

一种替代方法是更改模块。通常,如果要导出带有一堆函数的对象,则导出一堆命名函数会更容易,例如

export function foo() { console.log('foo') }, 
export function bar() { console.log('bar') },
export function baz() { foo(); bar() }

在这种情况下,您将导出所有带有名称的函数,因此您可以执行

import * as fns from './foo';

获取具有每个函数属性的对象,而不是您在第一个示例中使用的导入:

import fns from './foo';