在我的程序中,使用function()
语法返回this
目标元素的值,但是使用箭头函数返回window对象。这两个功能分别如何获得this
?
function editTemplates() { //sits within for loop clocksTemplate.gmt[i].addEventListener('keydown', (e) => { console.log(this); //returns window object }); clocksTemplate.gmt[i].addEventListener('keydown', function(e) { console.log(this); //returns element bound to clocksTemplate.gmt });
根据带有箭头功能的MDN,这应“从封闭的上下文中保留原始含义”。封闭上下文是事件侦听器吗?或它位于其中的功能?根据我的测试,箭头功能的封闭上下文必须是Window对象,但我看不到如何。使用function()语法,封闭函数旨在重新定义此值,我假设它在方法中正在执行此操作。这个主题在这里和这里已经进行了深入的讨论,但是我是JS新手,我不明白这对我的问题的影响。addEventListener
这是箭头功能的完全正常和预期的行为。
正如文档中提到的有关常规功能的内容:
每个新函数都定义了自己的
this
值(对于构造函数而言,是新对象,在严格模式函数调用中未定义,如果函数被称为“对象方法”,则为上下文对象,等等)。
如果需要在常规函数中覆盖this的值,则可以直接使用call()
或调用它,而不是直接调用它apply()
。
因此,在您使用常规函数的情况下,回调函数将由内部addEventListener
使用call()
或调用,且此函数的apply()
值设置为绑定到clocksTemplate.gmt
。使用call()
或apply()
调用回调是一种标准做法。
如果是第一个功能(箭头功能),则this
不会为分配任何新值。不能使用call()
或调用它们,apply()
因为箭头函数是匿名的。因此它继续具有由封闭函数定义的值,editTemplates()
并且恰好是window
。
参见下面的代码示例:
// REGULAR FUNCTION function editTemplates() { console.log(this) // window var myVar = this; // sits within for loop clocksTemplate.gmt[i].addEventListener('keydown', function(e) { // new value assigned for 'this' as element bound to clocksTemplate.gmt console.log(this); // returns element bound to clocksTemplate.gmt console.log(myVar); // returns window }); // ARROW FUNCTION (Anonymous Functions) function editTemplates() { console.log(this) // returns window object var myVar = this; // sits within for loop clocksTemplate.gmt[i].addEventListener('keydown', (e) => { // No new value gets assigned to 'this' console.log(this); // returns window object console.log(myVar); // returns window object // Saves the hassle of saving 'this' to another variable! });
希望这能回答您的问题。