美文网首页
Javascript定时器中的this指向

Javascript定时器中的this指向

作者: 指尖技术 | 来源:发表于2017-07-12 22:04 被阅读0次
  • 使用js中的定时器(setInterval,setTimeout),很容易会遇到this指向的问题。
    例如:

    var name = 'my name is window';
    var obj ={
    name:'my name is obj',
    fn:function(){
    var timer = null;
    clearInterval(timer);
    timer = setInterval(function(){
    console.log(this.name)//my name is window
    },1000)
    }
    }

    在这里,从this.name可以看出this的指向是window。

  • 如果没有特殊指向,setInterval和setTimeout的回调函数中this的指向都是window。这是因为JS的定时器方法是定义在window下的。但是平时很多场景下,都需要修改this的指向。这里总结了几种:

  1. 最常用的方法:在外部函数中将this存为一个变量,回调函数中使用该变量,而不是直接使用this。

    var name = 'my name is window';
      var obj ={
         name:'my name is obj',
          fn:function(){
              var that = this;
              var timer = null;
              clearInterval(timer);
              timer = setInterval(function(){
              console.log(that.name)//my name is obj
          },1000)
        }
    }
    

    在fn中加了var that = this; 回调函数中使用that代替this即可。这种方法最常见,使用也最广泛。

  2. 使用bind()方法(bind()为ES5的标准,低版本IE下有兼容问题,可以引入es5-shim.js解决)。
    bind()的作用类似call和apply,都是修改this指向。但是call和apply是修改this指向后函数会立即执行,而bind则是返回一个新的函数,它会创建一个与原来函数主体相同的新函数,新函数中的this指向传入的对象。

    var name = 'my name is window';
    var obj = {
         name: 'my name is obj',
         fn: function () {
         var timer = null;
         clearInterval(timer);
         timer = setInterval(function () {
              console.log(this.name);   //my name is obj
         }.bind(this), 1000)
      }
     }
    

    在这里为什么不能用call和apply,是因为call和apply不是返回函数,而是立即执行函数,那么,就失去了定时器的作用

  3. 使用es6的箭头函数:箭头函数的最大作用就是this指向。

    var name = 'my name is window';
    var obj = {
        name: 'my name is obj',
        fn: function () {
        var timer = null;
        clearInterval(timer);
        timer = setInterval(() => {
           console.log(this.name);  //my name is obj
       }, 1000)
     }
    }
    

    箭头函数没有自己的this,它的this继承自外部函数的作用域。所以,在该例中,定时器回调函数中的this,是继承了fn的this。当然箭头函数也有兼容问题,要是兼容低版本ie,需要使用babel编译,并且引入es5-shim.js才可以。

相关文章

  • Javascript定时器中的this指向

    使用js中的定时器(setInterval,setTimeout),很容易会遇到this指向的问题。例如:var ...

  • js字符串,定时器

    Javascript组成 字符串处理方法: 定时器在javascript中的作用: 定时器: setTimeout...

  • 关于js函数中this的指向的问题

    @(javascript)[JavaScript中this的指向] 关于js函数中this的指向的问题 javas...

  • This的指向总结

    1、//定时器中this的指向 结论:如果由定时器调用执行了某个函数,函数中有this,则这个this指向wind...

  • 函数中的this

    一,普通函数中的this指向,二,定时器方法中的this指向,三,构造函数中的this指向,四,对象方法中的thi...

  • JavaScript中this指向

    文章较长,希望你耐心阅读并有所收获。 this指向 想必各位看客老爷搜索此问题,多多少少还是被this迷惑住了,今...

  • JS中this的指向

    1、普通函数中this的指向( 普通函数中的this指针指向于调用者) 2、定时器中的this的指向 3、在对象...

  • javascript中的this指向

    写在前面 本文转自深入浅出 JavaScript 中的 this 在java等面向对象的语言中,this关键字的含...

  • Javascript 中 this 的指向

    大家好,我是IT修真院武汉第10期学员,一枚正直、纯洁、善良的前端程序员。 今天给大家分享一下,修真院官网任务...

  • JavaScript中的this指向

    1.概念 在JavaScript中,this 是指当前函数中正在执行的上下文环境,因为这门语言拥有四种不同的函数调...

网友评论

      本文标题:Javascript定时器中的this指向

      本文链接:https://www.haomeiwen.com/subject/sidihxtx.html