this的应用及指向问题

this的应用及指向问题

​ 总的原则,那就是this指的是调用函数的那个对象,即谁调用函数,this指向谁

//1.普通函数,定时器里面的函数,回调函数(函数做参数),自执行函数 --指向window(非严格模式)
    function fn(){
        alert(this);
    }
    fn() 
    
    window.setInterval(function(){
        alert(this);
    },1000)
    
    var arr=[1,2,3];
    arr.forEach(function(){
        alert(this);
    });
    
    (function(){
        alert(this);
    })()
    
    !function(){
        alert(this);
    }();
//2.对象里面的方法 --谁调用指向谁
    var obj = {
        a:1,
        showa:function(){
            function fn(){
                console.log(this) //没人调用它,默认window调用,所以这里的this指向window
            }
            alert(this);
            alert(this.a);
        }
    }
    obj.showa(); //由于是obj调用这个函数,那么this指向obj

    var fn1 = obj.showa; //这里可以看成 var fn1 = function(){
                                                    function fn(){
                                                        console.log(this) 
                                                        }
                                                        alert(this);
                                                        alert(this.a);
                                                    }
    
    fn1();//此时window调用fn1(),所以this指向window
//3.事件处理函数
    document.onclick = function(){
        alert(this); //这里由于是document调用这个函数所以this指向document
    }

//4.构造函数
    //构造函数的特点 1.首字母大写  2.一定要new运算符调用一下
    function Abc(){   //Abc:构造函数
        alert(this);    // this 指向 a1,a2
        this.name = 'zxh'  //由于这个this有个属性name所以它的实例对象都具有这个属性
    }
    var a1 = new Abc() //实例对象a1 a1.name = 'zxh'
    var a2 = new Abc() //实例对象a2 a2.name = 'zxh'
改变this的指向

想让this指向谁就指向谁的方法,this是整个js很重要的关键字

//函数下面的三个方法:call,apply,bind都可以改变this的指向

var num=10000;
var obj={
    num:10,
    shownum:function(){
        alert(this.num)
    }
    show:function(num1,num2){
        alert(this.num + num1 + num2)
    }
}
obj.shownum() //输出的是10
obj.shownum().call(window) //输出10000

obj.show(20,30) //输出10+20+30 = 60
obj.show.call(window,20,30) //输出10000+20+30 = 10050

//总结 call()的第一个参数是代表this的指向对象,后面的参数代表函数本身的参数
      apply()唯一与call()不同的是 apply的第二个参数是一个数组 obj.show.call(window,[20,30]) //依然输出10050 
      bind():第一个参数代表this的指向对象,从第二个参数开始代表的是函数本身的参数,返回的是函数体,需要再次调用。
      解析:obj.show.bind(window,20,30) //输出的是一个函数体
           obj.show.bind(window,20,30)() //10050
      使用场景:由于很多时候函数不是直接调用的,而是通过事件或定时器触发

转载于:https://www.cnblogs.com/xiaohanga/p/11074105.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值