call、apply、bind实现

7/20/2022 js

# 1. call

// 将函数设为对象的属性 -> 执行该函数 -> 删除该函数 --> 返回函数执行返回值
obj.f = fn
let ret = obj.f()
delele obj.f
return ret
function call(fn, context, ...args) {
	context = context || window // 默认为window
	context.f = fn
	let ret = context.f(...args)
	delete context.f
	return ret
}

# 2. apply

和call差不多,只是第三个参数是数组时忽略其后的参数,遍历传入即可
function apply(fn, context, ...args) {
	context = context || window
	context.f = fn
	if (Array.isArray(args[0])) args = args[0] // 多出这一行
	let ret = context.f(...args)
	delete context.f
	return ret
}

# 3. bind 实现

通过闭包的方式,存储context和args,返回的函数命名为fBind
function bind(fn, context, ...args) {
	context = context || window
	return function fBind(...args2) {
		if (this instanceof fBind) return new fn(...args, ...args2)
		return fn.apply(context, [...args, ...args2])
	}
}
    我想,
    在这个世界上,
    虽然没有最美好的相遇,
    但却应该有为了相遇或重逢,
    所做的最美好的努力。
    红莲华
    x
    loading...