Javascript 为什么分解参数对象会影响它';s';这';价值

Javascript 为什么分解参数对象会影响它';s';这';价值,javascript,scope,this,destructuring,Javascript,Scope,This,Destructuring,有人能告诉我为什么解构会影响对象的值吗。有很多简单的解决方法,但我只想知道这里到底发生了什么。看起来它应该可以工作,但是在分解引起的这个范围中发生了一些奇怪的事情。有人知道吗 下面是一个简单的对象: const user = { name: 'John', age: 30, sayHi() { console.log(this); // undefined for foo(), but defined for bar() return `hello, ${this.n

有人能告诉我为什么解构会影响对象的
值吗。有很多简单的解决方法,但我只想知道这里到底发生了什么。看起来它应该可以工作,但是在分解引起的
这个
范围中发生了一些奇怪的事情。有人知道吗

下面是一个简单的对象:

const user = {
  name: 'John',
  age: 30,
  sayHi() {
    console.log(this); // undefined for foo(), but defined for bar()
    return `hello, ${this.name}`;
  }
};
在foo中,我使用destructuring来访问对象键,但该值在sayHi()中未定义

但在这里,只需传入对象而不进行分解,就可以按预期工作,并且定义了this值。
在第一种情况下,通过分解结构,您创建了对
sayHi
函数的单独引用。然后,当您从foo主体调用它时,这将成为
sayHi
主体中
this
的上下文

在第二种情况下,您将其称为
person.sayHi
,因此本例中的上下文是包含对象,即
person
。在
sayHi
中,
这个
,名字已经定义

解构没有什么神奇之处,如果手动创建对函数的引用,您将获得相同的效果:

const bar = person => {
  const sayHi = person.sayHi;
  console.log(sayHi()); 
};

啊,我现在明白了。我知道这很简单。所以如果我想把bind()从对象中分离出来,我可以使用bind()。谢谢
const bar = person => {
  console.log(person.sayHi()); // hello, John
};

bar(user);
const bar = person => {
  const sayHi = person.sayHi;
  console.log(sayHi()); 
};