bind、call和apply都是Function
原型链上面的方法,因此不管是使用function
声明的函数,还是箭头函数都可以直接调用。这三个函数在使用时都可以改变this
指向,本文就带你看看如何实现bind、call和apply。
bind、call和apply的用法
bind
bind()
方法可以被函数对象调用,并返回一个新创建的函数。
语法
:
function.bind(thisArg[, arg1[, arg2[, ...]]])
bind()
会将第一个参数作为新函数的this
,如果未传入参数列表,或者第一个参数是null
或undefined
,那么新函数的this
将会是该函数执行作用域的this
。使用bind()
应注意以下事项:
- 返回一个新的函数,但是不会立即执行该函数
- 根据传入的参数列表绑定
this
指向,如果未传入thisArg
,那么需要明确this的指向 - 如果是箭头函数,无法改变this,只能改变参数,这一点我们在这些情况下不建议你使用箭头函数也讲到过
举个例子:
正常使用
function fn(a) {console.log(this, a)
}
const fn1 = fn.bind({x: 100}); // fn1是一个函数,但是并没有立即执行
fn1(); // {x:100} 100
console.log(fn === fn1); // false,bind返回的是一个新的函数
箭头函数
const fn = (a) => {console.log(this, a);
}
const fn1 = fn.bind({x: 100}, 100); // 返回一个新的函数fn1,不会执行
fn1(); // window,100 箭头函数通过bind返回的函数无法修改其this指向
未绑定this,或绑定到null、un