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
方法的范围内定义的,它从中获取此
值。