Javascript 什么是';这';参考在方法内部定义的IIFE内部定义的内部箭头函数?

Javascript 什么是';这';参考在方法内部定义的IIFE内部定义的内部箭头函数?,javascript,ecmascript-6,this,arrow-functions,Javascript,Ecmascript 6,This,Arrow Functions,我所理解的是,箭头函数不会重新绑定此,那么为什么它会根据调用方式引用不同的对象呢? const foo={ 讲{ (() => { console.log(this); })(); } }; foo.speak();//日志文件 const speak=foo.speak; 讲()记录全局对象箭头函数保留此的词法值。这意味着,this的值取决于arrow函数的定义方式,而不是arrow函数的调用方式 您在这里看到的不一致行为是因为每次调用函数speak时都会“定义”内部箭头函数。在该定义点,箭头

我所理解的是,箭头函数不会重新绑定
,那么为什么它会根据调用方式引用不同的对象呢?
const foo={
讲{
(() => {
console.log(this);
})();
}
};
foo.speak();//日志文件
const speak=foo.speak;

讲()记录全局对象
箭头函数保留此的词法值。这意味着,
this
的值取决于arrow函数的定义方式,而不是arrow函数的调用方式

您在这里看到的不一致行为是因为每次调用函数
speak
时都会“定义”内部箭头函数。在该定义点,箭头函数捕获
this
的当前值,这与
foo.speak()
speak()
不同


作为旁注,这看起来像是JavaScript的琐事。我不希望一个“真正的”代码库有这样的代码片段。

只有在每次调用
speak
时才定义和执行arrow函数。第一次调用它是作为
foo
上的方法,因此
绑定到
foo
。第二次调用时,
这是窗口。与此版本相比:

const foo = {
  speak: () => {
      console.log(this);
  }
};

foo.speak(); 

const speak = foo.speak;

speak(); 

其中,
speak
函数是arrow函数,因此,
会立即绑定到两个调用的
窗口
对象。

我相信发生的情况是,当您将函数分配给const变量时,它会失去作用域

调用
foo.speak()
时,speak函数在foo的上下文中运行,而在将foo.speak函数赋值给const变量后运行
speak()
时,函数在全局(窗口)对象的上下文中运行

MDN指出:

其值由函数的调用方式(运行时绑定)决定。它不能在执行期间通过赋值进行设置,每次调用函数时可能会有所不同


来源:

来自mdn。箭头函数对此没有自己的定义。使用封闭词法范围的此值;因此,在第一种情况下,您使用对象的作用域,因为它有自己的作用域,第二次
const speak
是在全局窗口中定义的。这意味着调用
speak()
将使用全局窗口的词法范围。这回答了你的问题吗<代码>此
始终查看其前面的对象。因为它不是第二次调用,所以
之前的对象
是全局的箭头函数是在
speak
方法的范围内定义的,它从中获取
值。