~function(proto){
function bind (context = window, ...outerArgs) {
return (...innerArgs) => {
let args = outerArgs.concat(innerArgs)
this.call(context,...args)
}
function call (context = window, ...args) {
context.fn = this
let result = context.fn(...args)
return result
}
function apply (context = window, args) {
context.fn = this
let result = context.fn(args)
return result
}
proto.bind = bind
proto.call = call
proto.apply = apply
}(Function.prototype)
bind,call,apply都是强制修改this的指向,语法
fn.call(context,arg1,arg2,...)
fn.apply(context,[arg1,arg2,arg,...])
fn.bind(context,arg1,arg2,...)
context上下文this如果不传参数,或者传null,undefined那么会被处理为window
call,apply方法修改this指向并且会立即执行。
bind方法是预处理修改this指向,传递参数,等待函数执行。