当前位置:  开发笔记 > 编程语言 > 正文

箭头函数将其作为窗口对象返回

如何解决《箭头函数将其作为窗口对象返回》经验,为你挑选了1个好方法。

在我的程序中,使用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



1> Santanu Bisw..:

这是箭头功能的完全正常和预期的行为。

正如文档中提到的有关常规功能的内容:

每个新函数都定义了自己的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!
    });

希望这能回答您的问题。

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有