【js高级】 call/apply/bind

call 改变this指向

	function Crazy(x,y) {
		console.log(x,y)
		console.log(this)
	}
	const obj = {
		name:'我是obj'
	}
	Cazy(1,2) // 12 // window
	Crazy.call(obj,1,2)   // 12  // Object  name: "我是obj"
  • call 方法可以改变Crazy函数的this指向

子构造函数继承父构造函数的 属性

	function Father(name,age){
		this.name = name
		this.age = age 
	}
	function Son(name,age,a){
		Father.call(this,name,age)
		this.a = a
	}
	const son = new Son('balabala',99,0)
	console.log(son)   // Son {name: 'balabala', age: 99,a: 0}

子构造函数继承父构造函数的prototype

	function Father(name,age){
		this.name = name
		this.age = age 
	}
	Father.prototype.money = function () {
		console.log(100000)
	}
	function Son(name,age,a){
		Father.call(this,name,age)
		this.a = a
	}
	// 让子元素的prototype指向父元素的实例 这样不会造成prototype的内存污染
	Son.prototype = new Father()
	// 将子元素的prototype的constructor指回子构造函数
	Son.prototype.cunstructor = Son
	Son.prototype.exam = function(){
		console.log('我要去考试')
	}

apply 改变this

	// 巧妙使用apply
	let Arr = [1,2,36,7,88]
	let maxNum = Math.max.apply(Math,Arr)
	console.log(maxNum)   // 88
  • 与call 的不同是 第二个参数需要是一个数组

bind 改变this指向

  • 与前两个不同的是 他不会调用这个函数
  • 返回的是一个改变this后的新函数

总结

相同点

都可以改变函数内部的this指向

区别点

  1. call和apply 会调用函数,并且改变函数内部的this指向
  2. call和apply传递的参数不一样,call传递参数num1,num2, apply 必须传递数组[num1,num2]
  3. bind不会调用函数,并且生成一个新函数,可以改变函数内部的指向

主要应用场景

  1. call 常做继承
  2. apply经常跟数组有关系 比如Math.max 的取最大值
  3. bind 不调用函数,并且还想改变this指向,比如改变定时器内部的this指向
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值