访问Coffeescript

时间:2018-05-22 03:00:03

标签: coffeescript

记住以下代码

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

1 个答案:

答案 0 :(得分:1)

看起来你有一个循环引用。

  1. A loading B
  2. B加载C
  3. C加载B.
    • 但是B没有加载,所以这里是一个空对象
  4. C完成加载
  5. B完成加载
  6. 加载C - 它已经加载,因此它只是一个参考。
  7. A完成加载后,文件末尾的console.log行将被执行。
  8. 以下是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中修复此循环依赖项:

    1。延迟加载

    在执行您的功能之前,./b中不需要c.coffee。当你在C.checkB内调用a.coffee时,B将被完全加载,并且将从require调用返回正确的类

    class C
      @checkB: ->
        B = require './b'
        console.log B.someStaticVar
    
    module.exports = C
    

    2。重构

    BC紧密耦合。考虑将它们重写为包含在单个文件中。您可以从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