this究竟指向谁?


前言

解析器在调用函数时,每次都会向函数内部传递一个隐含的参数,这个隐含的参数就是this,this指向的是一个对象,这个对象我们称为函数执行的上下文对象


一.this的指向

根据函数的调用方式的不同,this会指向不同的对象

1.全局作用域或者普通函数中

在全局作用域或者普通函数中,this永远都是window

	console.log(this) //window

2.作为对象方法的形式调用

作为对象方法的形式调用时,this就是调用方法的那个对象

 function fun(){
            console.log(this.name);
        }
        var obj={
            name:"孙悟空",
            sayName:fun
        };
        var obj2={
            name:"沙和尚",
            sayName:fun
        }
        console.log(obj.sayName==fun);//true
        obj.sayName();//孙悟空  <==> obj.name this即为obj
        obj2.sayName();//沙和尚 <==> obj2.name this即为obj2
        var name="全局的name";
        fun();//全局的name <==> window.fun() <==> window.name

3.在构造函数中调用

在构造函数中调用时, this 指向 实例对象

    function Person(age, name) {
         this.age = age;
         this.name = name;
         console.log(this);  // 此处 this 分别指向 Person 的实例对象 p1 p2
     }
    var p1 = new Person(18, "孙悟空");//Person {age: 18, name: "孙悟空"}
    var p2 = new Person(18, "猪八戒");//Person {age: 18, name: "猪八戒"}

4.使用call()和apply()调用时

使用call()和apply()调用时,this是指定的那个对象(可以通过call()和apply()来更改this的指向

  		var obj={
            name:"obj"
        };
        var obj2={
            name:"obj2"
        };
        function fun(){
            console.log(this);
        }
        fun();//window
        fun.call(obj);//obj
        fun.apply(obj);//obj
        fun.call(obj2);//obj2
        fun.apply(obj2);//obj2

call()方法可以将实参在对象之后依次传递
apply()方法需要将实参封装到一个数组中统一传递

  		function fun(a,b){
            console.log(a);
            console.log(b);
        }
        var obj={
            name:"obj",
            sayName:function(){
                console.log(this.name);
            }
        };
        var obj2={
            name:"obj2"
        };
        obj.sayName();//obj
        obj.sayName.apply(obj2);//obj2 传入的实参是谁,this就指向谁
        fun(obj);//{name: "obj", sayName: ƒ}  undefined
        fun.call(obj);//undefined undefined
        fun.call(obj,2,3);//2 3
        fun.apply(obj);//undefined undefined
        fun.apply(obj,[2,3]);//2 3

总结

this的指向分为:
1.在全局作用域或者普通函数中,this永远都是window
2.作为对象方法的形式调用时,this就是调用方法的那个对象
3.在构造函数中调用时, this 指向 实例对象
4.使用call()和apply()调用时,this是指定的那个对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值