Javascript 如何在**对象初始化时实现递归方法**?

Javascript 如何在**对象初始化时实现递归方法**?,javascript,recursion,this,bind,Javascript,Recursion,This,Bind,假设我有以下目标: const dog = { sound: 'woof', speak: function() { console.log(this.sound) } } 如何在初始对象文字声明中递归实现dog.speak 我可以通过在初始对象文本之外定义dog.speak方法来实现这一点。例如: const dog = { sound: 'woof' } const dog.speak = () => { console.log(dog.sound)

假设我有以下目标:

const dog = {
  sound: 'woof',
  speak: function() {
    console.log(this.sound)
  }
}
如何在初始对象文字声明中递归实现
dog.speak

我可以通过在初始对象文本之外定义
dog.speak
方法来实现这一点。例如:

const dog = {
  sound: 'woof'
}

const dog.speak = () => {
  console.log(dog.sound)
  window.setTimeout(dog.speak, 1000)
}
这是因为这里没有
这个
概念-
声音
属性明确属于
。但我更愿意在初始对象文本中定义这一切

为此,我需要通过
.bind()
保存
这个
上下文。但是,在进行递归函数调用之前,我正在努力确定我将
.bind()
dog
作为
this
的位置

const dog = {
  sound: 'woof',
  speak: function() {
    console.log(this.sound)
    const speak = this.speak.bind(dog)
    window.setTimeout(speak, 1000)
  }
}
这在单个对象文本中实现了目标

在初始函数调用中,我们可以将
dog
绑定为
this
,这将在以后的所有函数调用中保留
this
上下文

以前的尝试,例如:

const dog = {
  sound: 'woof'
}

const dog.speak = () => {
  console.log(dog.sound)
  window.setTimeout(dog.speak, 1000)
}

在第一次函数调用后,将丢失其
上下文<代码>此
将在第一次函数调用时引用狗
,然后在以后调用时引用窗口。

箭头函数

首选方法是使用具有词汇上下文的箭头函数,
this
-

//ECMAScript>=6
警犬={
声音:“呜”,
讲:函数(){
console.log(this.sound)
setTimeout(=>this.speak(),1000)
}
}

dog.speak()
。我更喜欢它,因为在其他方面
dog.speak.bind(dog)
(或
this.foo.bind(this)
或其任何变体)看起来像三明治。这是正确的,但很奇怪,因为对象在方法周围重复。是的。很好。不要使用上下文变量
ctx
,只需参考
dog
directlyNoted即可。谢谢你的评论^^