美文网首页
this指向例子

this指向例子

作者: LoveBugs_King | 来源:发表于2019-04-04 21:23 被阅读0次

    关于普通函数中this对象记住两点
    1、this对象是函数在运行时基于函数的执行环境绑定的。
    2、我们直到函数在被调用时,都会自动取得两个特殊变量thisarguments函数内在搜索这两个变量时只会搜索到自己的活动对象,不会像其它普通变量一样通过作用域向上去搜索。

    关于箭头函数中this对象:
    1、箭头函数this对象是在函数定义时绑定的,会指向最靠近该箭头函数的函数的环境(对象不算)。
    2、箭头函数调用时,没有arguments和this特殊变量,对箭头函数而言,他们就是普通变量,会沿着作用域去查找,找到最近一层函数作用域(比如{}对象的this不算哦)中的this或者arguments。而最近一层函数应该是个普通函数,它的this对象指向,就按上面普通函数的方法去找。
    3、箭头函数除了语法更精简,主要优点是解决了setTimeout、setInterval内函数的this指向问题(原本指向全局),现在可以就近指向。

    下面先来看看普通函数的this指向:

    例子1

    b()其实就是window.b(),执行环境是window对象,所以this对象绑定的是window对象,也就返回了全局对象‘111’。

    例子2

    首先obj.getA()函数的执行环境是obj,所以getA函数的this对象也就指向obj。
    obj.getA()返回的匿名函数,该函数的执行环境是全局环境,所以this指向全局对象,也就返回"111"。
    你可能会误以为匿名函数的this对象会根据作用域往上查找,其实并不会。

    例子3

    h函数是自己执行的,相当于执行环境是全局环境。

    例子4

    obj.getA()的执行环境是obj,函数内的this也就指向obj。
    把obj.get函数取出来后,在外部执行,执行环境就是全局环境,函数内的this也就指向全局变量。

    例子5

    o.b.fn(),函数fn的执行环境是b对象,但b对象中并无a变量,所以返回undefined。
    当this碰到return时:如果返回值是一个对象(不包括null),那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例

    当碰到return时

    下面来看看箭头函数:
    setTimeout和setInterval中this指向的问题

            setTimeout和setInterval中写入的函数func相当于闭包,函数func被return出来了。所以函数func中的this会指向全局。如果想要this指向正确的值,有3种方法。

    1、将当前对象的this存为一个变量,定时器内函数引用的变量都会因为闭包的作用而长久持有、不被垃圾收集器回收。

    变量指定

    2、箭头函数,箭头函数内的this指向 当前父级上下文环境。其实就是前一种的方法,给我们做了简化。

    箭头函数

    3、bind()方法,Function.prototype上的一个方法,当被绑定函数执行时,bind方法会创建一个新函数,并将第一个参数作为新函数运行时的this。

    bind方法,当然使用call或apply方法来代替bind方法,得到的结果也是正确的,但是call方法会在调用之后立即执行,那样也就没有了延时的效果,定时器也就没有用了

    相关文章

      网友评论

          本文标题:this指向例子

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