JavaScript中call(),bind(),apply()方法

call是函数的方法,call可以调用函数

 function fun(){
    console.log('Hello World');
  }
  fun.call()

call可以改变函数中this的指向。

function fun() {
        console.log(this.name) //this默认指向window
      }
 
  let cat = {
    name: '喵喵'
  }
  // call改变this指向,将this指向由window改为cat
  fun.call(cat)
  
  let dog = {
    name: '旺财',
    sayname() {
      console.log('我是' + this.name)
    }
  }
  dog.sayname()
  // call改变this指向,将this指向由dog改为cat
  dog.sayname.call(cat)

传参

let dog = {
    name: '旺财',
    sayname() {
      console.log('我是' + this.name)
    },
    eat(food1, food2) {
      console.log('我喜欢吃' + food1 + food2)
    }
  }
  dog.sayname()
  dog.sayname.call(cat)
  // 第一次参数为改变的this指向,后面的参数是函数的参数列表
  dog.eat.call(cat, '鱼', '肉')
  dog.eat.apply(cat, ['鱼', '肉'])
  let a=dog.eat.bind(cat, '鱼', '肉') //bind不会调用函数,但是会作为返回值返回函数
  console.log(a);

call和apply都可以直接调用函数,传参方式不同;
call和bind传参方式相同,但是call可以调用函数,bind不会调用函数,但是会返回函数。

call可以用来继承父类的方法

  function Animal() {
    this.eat = function () {
      console.log('吃东西')
    }
  }
  // Cat继承Animal的eat方法
  function Cat() {
    Animal.call(this) //这里的Animal构造函数作为普通函数,将Animal函数中的this指向cat,this.eat,即cat.eat,cat就继承eat方法
  }

  let cat = new Cat()
  cat.eat() //cat就可以调用eat方法

1,call()、apply()、bind() 都是用来重定义 this 这个对象的!
  在这里插入图片描述
obj.myFun.call(db);    //德玛年龄99,将this由obj指向db
obj.myFun.apply(db);    //德玛年龄99
obj.myFun.bind(db)();   //德玛年龄99,bind不能调用函数

以上出了bind 方法后面多了个 () 外 ,结果返回都一致!
由此得出结论,bind 返回的是一个新的函数,你必须调用它才会被执行

2,对比call 、bind 、 apply 传参情况下
   在这里插入图片描述
  
  obj.myFun.call(db,‘成都’,‘上海’);     //德玛 年龄 99 来自 成都去往上海
  obj.myFun.apply(db,[‘成都’,‘上海’]); //德玛 年龄 99 来自 成都去往上海
  obj.myFun.bind(db,‘成都’,‘上海’)(); //德玛 年龄 99 来自 成都去往上海
  obj.myFun.bind(db)(‘成都’,‘上海’);   //德玛 年龄 99 来自 成都,上海去往undefined
 
call 与 apply 的相同点
方法的含义是一样的,即方法功能是一样的;
第一个参数的作用是一样的;

call 与 apply 的不同点:两者传入的列表形式不一样
call可以传入多个参数;
apply只能传入两个参数,所以其第二个参数往往是作为数组形式传入

call 、bind 、 apply
  这三个函数的第一个参数都是 this 的指向对象;
  而第二个参数存在差别:
  call的参数是直接放进去的,第二第三第n个参数全都用逗号分隔,直接放到后面 obj.myFun.call(db,‘成都’, … ,‘string’ );
  apply的所有参数都必须放在一个数组里面传进去 obj.myFun.apply(db,[‘成都’, …, ‘string’ ]);
  bind除了返回是函数以外,它 的参数和call 一样。
    
  当然,三者的参数不限定是string类型,允许是各种类型,包括函数 、 object 等等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值