ES6导出默认有多个函数相互引用
ES6 export default with multiple functions referring to each other
在es6中你可以定义一个函数模块,像这样
export default {
foo() { console.log('foo') },
bar() { console.log('bar') },
baz() { foo(); bar() }
}
上面的似乎是有效的代码,但如果我调用baz()
,它抛出一个错误:
ReferenceError: foo is not defined
如何从另一个函数调用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
现在必须变得明显,在模块的作用域中没有foo
, bar
或baz
函数。但是有一个名为funcs
的对象(尽管实际上它没有名称),它包含这些函数作为其属性,并将成为模块的默认导出。
所以,要修复你的代码,重写它,不使用快捷方式,并引用foo
和bar
作为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
对象,而不必显式声明它,正如@pawel所指出的。
另一种选择(也是我通常更喜欢的一种)是在模块作用域中声明这些函数。这允许直接引用它们:
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'
在一个对象中获取所有命名的导出。
另一种选择是更改模块。一般来说,如果你要导出一个带有一堆函数的对象,导出一堆命名函数会更容易,例如
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';
br: baz() { this.foo(); this.bar() }
在ES2015中:
var obj = {
foo() { console.log('foo') }
}
等于这个ES5代码:
var obj = {
foo : function foo() { console.log('foo') }
}
exports.default = {}
就像创建一个对象,你的默认导出转换为ES5代码,像这样:
exports['default'] = {
foo: function foo() {
console.log('foo');
},
bar: function bar() {
console.log('bar');
},
baz: function baz() {
foo();bar();
}
};
现在很明显(我希望)baz
试图调用在外部作用域中定义的foo
和bar
,这是未定义的。但是this.foo
和this.bar
将解析为exports['default']
对象中定义的键。所以默认的导出引用它自己的方法应该是这样的:
export default {
foo() { console.log('foo') },
bar() { console.log('bar') },
baz() { this.foo(); this.bar() }
}
- 如何在JavaScript中将字符串转换为函数引用
- IIFE中的函数引用不可用
- Wordpress中的Javascript出现匿名函数/引用错误
- 将函数引用存储在散列中在javascript中无法正常工作
- Google可视化addListener调用函数引用错误
- 如何存储包含参数的JS函数引用
- 如何从函数引用元素(从事件侦听器调用)
- 将函数引用传递给嵌套闭包
- Javascript递归函数引用了这一点
- 在Node.js中,从同一文件中的另一个函数引用一个函数会导致'ReferenceError:-函数-未定义
- 为什么将函数引用封装到匿名函数中可以更正'这'指向
- 如何在ES6中使用Arrow函数引用对象内部的其他函数
- 复制不带属性的函数引用
- 在控制器中使用具有函数引用的服务
- Jquery 和闭包或函数引用不起作用
- 将函数引用传递给函数失败
- Jasmine spyOn:当传递间谍函数引用时如何使其工作
- 从 Javascript 中的嵌套函数引用对象成员
- Typescript-不同文件中的模块函数引用-“;找不到符号“;
- 与许多事件侦听器和函数引用一个对象相比,什么是更好的方法