📜  javascript this in settimeout - Javascript (1)

📅  最后修改于: 2023-12-03 14:42:27.471000             🧑  作者: Mango

JavaScript中的thissetTimeout中的应用

在JavaScript中,this关键字经常使用,它表示当前执行上下文中的对象。当使用setTimeout时,this的值可能会出现问题,因为它不是在同一个上下文中运行的.

问题描述

看下面的代码块:

const btn = document.querySelector('button');
btn.addEventListener('click', function() {
  setTimeout(function() {
    console.log(this); // `this`的值可能是全局作用域
  }, 1000);
});

当按钮被点击时,控制台将会输出全局作用域的this值。这是因为在setTimeout中,this的值不再是事件监听器中的this值,而是全局对象。这时候就需要考虑如何在setTimeout中使用正确的this值。

解决方案

有几种方法可以在setTimeout中使用正确的this值:

  • 在ES6中,可以使用箭头函数来解决这个问题,因为箭头函数中的this是在定义时绑定的,不会受到函数调用的影响:

    const btn = document.querySelector('button');
    btn.addEventListener('click', function() {
      setTimeout(() => {
        console.log(this); // 当前监听器对象
      }, 1000);
    });
    
  • 可以将this值保存在变量中并传递给setTimeout

    const btn = document.querySelector('button');
    const self = this; // 保存`this`
    btn.addEventListener('click', function() {
      setTimeout(function() {
        console.log(self); // 当前监听器对象
      }, 1000);
    });
    
  • this值作为setTimeout的第三个参数传递:

    const btn = document.querySelector('button');
    btn.addEventListener('click', function() {
      setTimeout(function() {
        console.log(this); // 当前监听器对象
      }.bind(this), 1000);
    });
    

以上是几种解决方法,具体的实现方式取决于每个人的口味和项目的需要。总之,在使用setTimeout时,一定要注意this的值。

结论

this是JavaScript中非常重要的概念。在经典的JavaScript语法中,this在调用时的值在执行上下文中确定。然而,在ES6中,箭头函数有自己的this上下文,定位于其定义范围中的this,不受函数调用的影响。setTimeout中的this值需要额外小心,可以使用上述方法来解决问题。