区分bind,apply,call

JavaScript的this指向

Js,函数的调用方式决定this的值

function f1(){
	console.log(this)
}
f1() // window

bind,apply,call可以更改this的指向

call()

call()第一个参数是指向的对象,当为nullundefined时指向window;第二个是传递的参数(任意类型)

function f1(){
	console.log(this)
}
var obj = {}
f1.call(obj) // obj
f1()//window

apply()

apply()call()类似,但第二个参数需要为按顺序的数组。

function f1(){
	console.log(this)
}
var obj = {}
f1.apply(obj,[])//obj
f1()//window

bind()

bind()参数与call()相同,但不会立刻执行,而是返回绑定新this的对象。

function f1(){
	console.log(this)
}
var obj = {}
var i = f1.bind(obj)
i()//obj

手写call()

Function.prototype.myCall(content){
	content = content || window
	content.fn = this
	var arg = [...content].slice(1)
	let result = content.fn(...arg)
	delete content.fn
	return result
}

手写apply()

Function.prototype.myApply(content){
	content = content || window
	content.fn = this
	let result 
	if(arguments[1]){
		result = content.fn(...arguments[1])
	}else{
		result = content.fn()
	}
	delete content.fn
	retuern result
}

手写bind()

Function.prototype.myBind(content){
	let that = this
	//支持柯里化
	let arg = [...arguments].slice(1)
	return function(){
		//支持柯里化
		let args = [...arg]
		return that.apply(content,arg.conact(args))
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值