gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:55:02 27 4
gpt4 key购买 nike

在 es6 中你可以像这样定义一个函数模块

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

上面的代码似乎是有效的代码,但如果我调用 baz() 它会抛出一个错误:

ReferenceError: foo 未定义

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

编辑

这是实际上不起作用的代码。我已经简化了代码,所以它只是需要的核心

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

我只是尝试在 expireToken 之前添加 tokenManager 并且它终于起作用了

最佳答案

export default {...} 构造只是这样的快捷方式:

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

export default funcs

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

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

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

export default funcs

另一种选择是使用 this 关键字来引用 funcs 对象,而不必显式声明它,as @pawel has pointed out .

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

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' 将所有命名导出放在一个对象中。

关于javascript - ES6 导出默认值,多个函数相互引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33178843/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com