this的指向问题与在函数对象下强制改变this指向

函数对象下,强制改变this指向的三个方法

1.call

函数.call(参数1,参数2)

第一个参数位置,必定传入的是,this的指向

从第二个参数开始,是原有的参数往后顺延一位,也就是多了一个要指向的字符串,但是还是表示的原有的参数

例如:show.call(“call”,40,50); 只是强制将this指向"call",40还是赋值给num1,50还是赋值给num2

例题:

function show(num1,num2){
            alert(this);
            alert(num1 + "," + num2)
        }
        show(10,20);
        //强制改变这个函数中this的指向
        show.call("call",40,50);
2.apply

函数.apply
第一个参数位置,必定传入的是this指向,赋值参数的时候,直接把赋值的数放到数组中传入进去

    例题:(与call传入参数的方法不同,要分清)
            function show(num1,num2){
                alert(this);
                alert(num1 + "," + num2)
            }
            show(10,20);
            //强制改变这个函数中this的指向
            show.apply("apply",[40,50]);

【注】 前两个强制改变指向的方式是直接改变,而bind方法是先预设要改变的this指向,然后调用的时候再改变

3.bind 先预设后调用

函数.bind(this的指向);

功能:预设this的指向

返回值:还是原函数(函数中的this被预设了)

例题:
            function show(num1,num2){
                alert(this);
                alert(num1 + "," + num2)
            }
            
            show(10,20);
            //强制改变这个函数中this的指向
            
            var res = show.bind("bind");
            
            res(40,50);
            //也可以直接写函数调用函数,注意参数的赋值,要单独在括号中
            show.bind("bind1")(70, 80);

this指针

【注】只要发生函数赋值,this指向就会发生变化

this 每一个函数内部都有一个内置变量 this永远指向当前函数的主人
总结:

1.当前函数的主人是window

也就是当在全局定义一个变量的时候,this指代的就是window

调用函数的时候 window.show() = show() window可以省略,所以this指代window

     function show(){
                alert(this);
            }
            window.show();
            show();*/
2.事件绑定中,this一般情况下指向当前函数的绑定的元素节点,也就是谁参与的时间绑定

例如下面,是oBtn按钮参与的点击事件,所以this指代的就是oBtn

      window.onload = function(){
                var oBtn = document.getElementById("btn1");
                oBtn.onclick = function show(){
                    alert(this);
                }

【注】当把函数直接赋给oBtn的时候,例:oBtn.onclick = show; 这个时候show的父级也是oBtn

3.对象中的方法;this指向当前这个对象

例如:定义obj为一个对象,里面的函数就是指代的obj

因为showName与后面的函数相等,所以showName也是个函数,showName的父级就是obj对象,所以this指代的就是obj

        var obj = {
                name: "小明",
                sex: '男',
                age: 18,
                showName: function(){
                    alert(obj.name);
                    alert(this.name)
                }
            }
             obj.showName();
4.如果没有特殊指向,setinterva和setTimeout的回调函数中this的指向都是window.

这是因为JS的定时器方法是定义在window下的。但是平时很多场景下,都需要修改this的指向。

5.箭头函数中this的指向

箭头函数中的this,不指向当前函数的主人,指向上一级函数的主人

例如:当不用指针的时候,this指代的是对象person

    var person = {
                name: "钢铁侠",
                age: 18,
                showName:function(){
                    alert(this); //[object Object]
                    alert(this.name); //钢铁侠
                }
            }
            person.showName();

当用箭头函数时:

    var person = {
            name: "钢铁侠",
            age: 18,
            showName:() => {
                alert(this); //object Window    解析:箭头函数中的this,不指向当前函数的主人,指向上一级函数的主人
                //alert(this.name); //空字符串,因为window里没有name变量
            }
        }
        person.showName();

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值