【问题标题】:Circular const, let declaration for graph ... how to fix?循环常量,让图声明......如何解决?
【发布时间】:2019-06-26 13:31:20
【问题描述】:

好的,大脑冻结...我需要帮助来完成这项工作:

const a = {
  val: 'a',
  neighbor: d
}

const b = {
  val: 'b',
  neighbor: a
}

const c = {
  val: 'c',
  neighbor: b
}

const d = {
  val: 'd',
  neighbor: c
}

console.log('d: neighbor - > ', d.neighbor)
console.log('a: neighbor - > ', a.neighbor)

const a 必须指向 const d 但不幸的是 const d 是在 const a 之后定义的。在大多数情况下,我可以将 const a 移到 const d 之后定义,但在这种情况下,const d 需要在 const c 之后定义。我错过了什么……?谢谢

【问题讨论】:

    标签: javascript ecmascript-6 scope hoisting


    【解决方案1】:

    您可以将neighbor 属性定义为getter。 getter 实际上是一个函数,它在您检索对象的值时执行,即此时所有引用的对象都已定义。这样您还可以保护neighbor 属性免受意外更改。

    const a = {
        val: 'a',
        get neighbor () {return d;}
    };
    const b = {
        val: 'b',
        get neighbor () {return a;}
    };
    const c = {
        val: 'c',
        get neighbor () {return b;}
    };
    const d = {
        val: 'd',
        get neighbor () {return c;}
    };
    
    console.log('d: neighbor - > ' , d.neighbor);
    console.log('a: neighbor - > ' , a.neighbor);

    【讨论】:

      【解决方案2】:

      声明所有对象没有“neighbor”属性,然后在单独的分配中添加它。

      const a = {
          val: 'a'
      }
      
      const b = {
          val: 'b'
      }
      
      
      const c = {
          val: 'c'
      }
      
      const d = {
          val: 'd'
      }
      
      a.neighbor = d;
      b.neighbor = a;
      c.neighbor = b;
      d.neighbor = c;
      

      【讨论】:

      • 或者您可以在原始对象定义中将neighbors 定义为吸气剂。
      • @Teemu 砍柴,挑水 :)
      • 一直以来,这有什么关系?
      • 这是一个佛教格言,我一直认为它的意思是“先走后跑”,但佛教 stackexchange 上的答案不同意我的看法。我绝对不会涉足那个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多