记住以下代码
a.coffee
B = require './b'
C = require './c'
console.log B.someStaticVar
C.checkB()
b.coffee
C = require './c'
class B
@someStaticVar: 1
module.exports = B;
c.coffee
B = require './b'
class C
@checkB: ->
console.log B.someStaticVar
module.exports = C
我试图理解为什么 c 访问时 b 的静态属性未定义,但访问时返回 1 一个
输出:
$ coffee a.coffee
1
undefined
答案 0 :(得分:1)
看起来你有一个循环引用。
console.log
行将被执行。以下是3个模块的一个版本,可以更好地说明这一点:
<强> a.coffee 强>
B = require './b'
C = require './c'
console.log B.someStaticVar
C.checkB()
<强> b.coffee 强>
C = require './c'
console.log 'in b.coffee, we have loaded C: ', C
class B
@someStaticVar: 1
module.exports = B;
<强> c.coffee 强>
B = require './b'
console.log 'in c.coffee, we have loaded B: ', B
class C
@checkB: ->
console.log B.someStaticVar
module.exports = C
您可以通过两种方法在commonjs中修复此循环依赖项:
在执行您的功能之前,./b
中不需要c.coffee
。当你在C.checkB
内调用a.coffee
时,B将被完全加载,并且将从require调用返回正确的类
class C
@checkB: ->
B = require './b'
console.log B.someStaticVar
module.exports = C
B
和C
紧密耦合。考虑将它们重写为包含在单个文件中。您可以从require './c'
中删除b.coffee
。虽然我猜这是在这个例子中,因为你的代码更复杂,并且确实需要它。
<强> a.coffee 强>
{ B, C } = require './b'
console.log B.someStaticVar
C.checkB()
<强> b.coffee 强>
class B
@someStaticVar: 1
class C
@checkB: ->
console.log B.someStaticVar
module.exports =
C: C
B: B