最近在看八股文,看到了bind、call、apply,鉴赏了bind、call、apply 有什么区别?如何实现一个bind?- 题目详情 - 前端面试题宝典 (ecool.fun) 这三我以前也只是知道它们能改变this指向,但什么情况下需要改变呢?
const name="lucy";
const obj={
name:"martin",
say:function () {
console.log(this.name);
}
};
obj.say(); //martin,this指向obj对象
setTimeout(obj.say,0); //lucy,this指向window对象
从上面我们可以看出,我们把say放在setTimeout方法中,在定时器中是作为回调函数来执行的,因此回到主栈执行时是在全局执行上下文的环境中执行的,这时候this指向window,所以输出luck
我们知道了为什么要改变this指向,那这3个的区别呢?
apply:apply接受两个参数,第一个参数是this的指向,第二个参数是函数接受的参数,以数组的形式传入,改变this指向后原函数会立即执行,且此方法只是临时改变this指向一次;当第一个参数为null、undefined的时候,默认指向window(在浏览器中)
call:第一个参数是this的指向,后面传入的是一个参数列表,其它和apply一样
bind:bind方法和call很相似,第一参数也是this的指向,后面传入的也是一个参数列表(但是这个参数列表可以分多次传入);改变this指向后不会立即执行,而是返回一个永久改变this指向的函数
小结:
- 三者都可以改变函数的
this对象指向 - 三者第一个参数都是
this要指向的对象,如果如果没有这个参数或参数为undefined或null,则默认指向全局window - 三者都可以传参,但是
apply是数组,而call是参数列表,且apply和call是一次性传入参数,而bind可以分为多次传入 bind是返回绑定this之后的函数,apply、call则是立即执行