是什么?
bind,call,apply都是用来改变this指向的
什么是this?为什么要改变this指向?
- 在浏览器中,在全局范围内this 指向window对象;
- 在普通函数中,this永远指向最后调用他的那个对象;
- 在构造函数中,this指向new出来的那个新的对象;
- call、apply、bind中的this被强绑定在指定的那个对象上;
- 箭头函数中this比较特殊,箭头函数this为父作用域的this,不是调用时的this.要知道前四种方式,都是调用时确定,也就是动态的,而箭头函数的this指向是静态的,声明的时候就确定了下来;
- 所以箭头函数的this是无法修改的
- apply、call、bind都是js给函数内置的一些API,调用他们可以为函数指定this的执行,同时也可以传参。
在一个函数调用的时候,this就是一个指针,this值取决于这个函数是怎样被调用的,这就有点变态了,也就是说,this的指向不是固定的,当this指向不是我们的理想指向时,我们就要想办法去改变this的指向。
例如:
如上所示,当函数嵌套一个内层函数时,为什么我们在外层函数将this指向赋值给that保存一下,而不是在内层函数中直接使用this呢,因为内层函数Zpy1并不会继承外层函数Zpy的this值,内层函数的this此时指向的是它的调用者Zpy1。
怎么用?
上代码:
如图所示:
如果想让Zpy.info()打印对象Sj的信息,则需要改变this指向,让this指向对象Sj,
三种方法有什么区别?
写法上的区别如图:
bind()与apply()、call()不同的是,bind方法返回的仍然是一个函数,因此后面还需要()来进行调用才可以。
传参时的区别如图:
call后面的参数与say方法中是一一对应的,而apply的第二个参数是一个数组,数组中的元素是和say方法中一一对应的,这就是两者最大的区别。
那么bind怎么传参呢?它可以像call那样传参。
Zpy.info.bind(Sj,"38","小坏蛋")();
但是由于bind返回的仍然是一个函数,所以我们还可以在调用的时候再进行传参。
Zpy.info.bind(Sj)("38","小坏蛋");