js-this

作者: 16325 | 来源:发表于2020-02-20 11:20 被阅读0次

    javascript中的this

    js中的this,比较难以理解,下面进行简单记录。主要分为以下几种情况

    • 方法调用

    • new 对象

    • 箭头函数

    • 手动bind

    箭头函数

    其他情况,都是谁调用,this就是谁,比较简单。这里重点说一下箭头函数中的this。
    箭头函this,看声明!生命的时候上下文中this是谁,就固定下来。再也不会改变了。

    • this只有在函数被调用,或者通过构造函数new Object()的形式才会有this

    • ES6中定义的时候绑定this的具体含义,应该继承的是父执行上下文里面的this,切忌是父执行上下文!!!这样就很多箭头函数中的指向不明确就迎刃而解了。

    • 注意:简单对象(非函数)是没有执行上下文的!

    1 首先,看例子:

    var a = 1;
    var obj = {
      a: 2
    };
    var fun = () => console.log(this.a);
    fun();//1
    fun.call(obj)//1
    

    那么箭头函数的this是怎么确定的呢?箭头函数会捕获其所在上下文的 this 值,作为自己的 this 值,也就是说箭头函数的this在词法层面就完成了绑定。apply,call方法只是传入参数,却改不了this。

    这里在声明箭头函数的时候,var fun = () => console.log(this.a);相当于window.fun = () => console.log(this.a);所以这里this是windows

    函数生命的地方(fun 有意义的地方),看父执行上下文(全局),没有父级函数,所以是全局上下文,this=windows

    2 第二个列子:

    var a = 1;
    var obj = {
      a: 2
    };
    function fun() {
        var a = 3;
        let f = () => console.log(this.a);
          f();
    };
    fun();//1
    fun.call(obj);//2
    

    如上,fun直接调用,fun的上下文中的this值为window,注意,这个地方有点绕。fun的上下文就是此箭头函数所在的上下文,因此此时f的this为fun的this也就是window。当fun.call(obj)再次调用的时候,新的上下文创建,fun此时的this为obj,也就是箭头函数的this值。

    这里第一个相当于window.fun 所以在这时候fun内部的this是windows

    第二个,func绑定了obj,所以在fun中的this是obj

    注意这个题并不是this变了。而是剪头函数在fun执行时候才会声明,不执行就不会有这个箭头函数。所以这里两个输出声明了两个剪头函数,分别绑定了不同的this

    函数生命的地方(f 有意义的地方),看父执行上下文(fun函数)
    第一题:相当于window.func() , fun中的this=windows
    第二题:相当于obj.fun(), fun中的this=obj

    3 再来一个:

    function Fun() {
        this.name = 'Damonare';
    }
    Fun.prototype.say = () => {
        console.log(this);
    }
    var f = new Fun();
    f.say();//window
    

    有的同学看到这个会很懵逼,感觉上this应该指向f这个实例对象啊。不是的,此时的箭头函数所在的上下文是proto所在的上下文也就是Object函数的上下文,而Object的this值就是全局对象。

    这里say是一个剪头函数。声明的时候上下文是Fun.prototype。Fun.prototype就是object的实例。相当于绑定了一个空白对象 。

    函数生命的地方(say 有意义的地方),看父执行上下文(全局)
    相当于给一个object对象赋值一个say函数,是没有父级函数存在的,所以this=window

    1. 最后一个
    function Fun() {
        this.name = 'Damonare';
          this.say = () => {
            console.log(this);
        }
    }
    var f = new Fun();
    f.say();//Fun的实例对象
    

    如上,this.say所在的上下文,此时箭头函数所在的上下文就变成了Fun的上下文环境,而因为上面说过当函数作为构造函数调用的时候(也就是new的作用)上下文环境的this指向实例对象。

    函数生命的地方(say 有意义的地方),看父执行上下文(Fun)
    这时fun相当于构造函数,因为是new出来的,所以Fun中的this就是新创建的对象,也就是f,所以this=f

    总结:看箭头函数声明的地方,也就是真的会给对象赋值的地方,执行到这里的时候,外围函数的this是谁,箭头函数就是谁,如果没有外围函数,那么this就是全局对象window

    相关文章

      网友评论

          本文标题:js-this

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