JavaScript中的this指向

今天我们就简单聊一聊JavaScript里面的this指向吧

  this的指向

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

   函数内的this指向

  •    以函数的形式(包括普通函数,定时器函数,立即执行函数)调用时,this指向永远是window
  •    以方法的形式调用时,this指向调用方法的就是哪个对象;
  •    以构造函数的形式调用时,this指向实例对象
  •    以事件绑定函数的形式调用时,this指向绑定事件的对象
  •    使用call或apply或blnd调用时,this指向的需要查找的对象

       call()方法的运用

  •         call()方法可以调用一个函数,与此同时,它还可以改变这个函数内部的this指向;
  •         call()方法还可以继承
  •         fn.call(想要this指向哪里,val1,val2......)
  •         第一个参数中,如果不需要改变this的指向,则传递null;
function fn1(name, age) {
             this.name = name;
             this.age = age;
             this.fn = function () {
                 console.log(this.name)
             }
         }
         function fn2(name, age) {
             fn1.call(this, name, age);//此时的this指向就是fn1里面的name,age
         }
         var fn3 = new fn2("张三", 18);//给我们fn2赋值
         console.log(fn3);//这里我们输出声明的fn3;
         fn3.fn();//这里我们的fn调用的是fn1里面的方法 输出的是name;也就是fn3里面赋值的值“张三”;

输出结果如下:

0ea4daea067544f1bc0431a636d75fa8.png

 

 

当然还有一个充电宝的案例 同时使用了call()或apply()或blnd()

如下:

 //当is只有一个值时
        //充电宝
        var o1 = {
            name: "张三",
            dl: 20,
            is: function fn(cd) {
                this.dl = cd;
            }
        }
        var o2 = {
            name: "李四",
            dl: 5
        }
        console.log(o1);
        o1.is(100);
        console.log(o1);

        //使用call()方法
        o1.is.call(o2, 100);
        console.log(o2);

        //使用 apply()方法
        o1.is.apply(o2, [80]);
        //使用apply方法的话  传的参数需要加中括号
        console.log(o2);

        //使用bind()方法
        var res = o1.is.bind(o2, 100);//传的参数
        res();
        console.log(o2.dl);

        console.log("----------------------------------------------")
        //当is有两个参数时
        //充电宝
        var o1 = {
            name: "张三",
            dl: 20,
            is: function fn(cd, dc) {
                this.dl = cd + dc;
            }
        }
        var o2 = {
            name: "李四",
            dl: 5
        }
        console.log(o1);
        o1.is(50, 50);
        console.log(o1);

        //使用call()方法 改变this的指向
        o1.is.call(o2, 90, 5);
        console.log(o2);

        //使用 apply()方法 改变this的指向
        o1.is.apply(o2, [80, 15]);
        //使用apply方法的话  传的参数需要加中括号
        console.log(o2);

        //使用bind()方法 bind()可以先调用改变this的指向 然后储存到新的函数体里面,当调用的时候调用新的函数体即可;
        var res = o1.is.bind(o2, 50, 50);//传的参数 
        res();
        console.log(o2.dl);

        //call(),apply(),bind();它们三个都可以改变this的指向,但bind() 相比较call(),apply();有点繁琐,但是有的地方不得不使用bind() 方法

输出如下

b6b48dde9c3a4a9896881fbf4621c953.png

 使用apply方法的话  传的参数需要加中括号 

//我的理解是这样的  不知道大家是如何理解的  有更好的理解方法的话也可以给我传授一点;

 

 使用bind()方法 bind()可以先调用改变this的指向 然后储存到新的函数体里面,当调用的时候调用新的函数体即可;

  //call(),apply(),bind();它们三个都可以改变this的指向,但bind() 相比较call(),apply();有点繁琐,但是有的地方不得不使用bind() 方法

如果有的地方没有编辑好请各位见谅,我也会积极更改;

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一路向东.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值