this
this是 JavaScript 语言的一个关键字。
它是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用。
在函数调用时默认的实例对象是window,而如果有指定对象来调用函数,那么函数中的this一般来说就是指向当前对象。
要明白这三个函数的存在意义是什么?答案是改变函数执行时的上下文,再具体一点就是改变函数运行时的this指向。
我们就可以使用call、apply和bind等方法来实现
call
- 语法:
fn.call([this],[x],[xx]...)
call函数主要接受2种参数,第一是this指向的转移对象,如果不传参数,或者第一个参数是null或nudefined,this都指向window,默认调用全局对象。
接下来的参数则是函数可能会遇到的可选参数。
<script>
const A = {
name : 'apple',
showName: function(param){
console.log(this.name,param)
}
}
let pear = {name: 'pear'};
A.showName.call(pear,'ppp') //pear ppp
</script>
apply
fn.apply([this],['x','xx',...])
apply的用法其实和call基本没啥区别,主要的区别在于对参数的传递,call和apply的第一个参数都是要改变上下文的对象,而call从第二个参数开始以参数列表的形式展现,apply则是把除了改变上下文、对象的参数放在一个数组里面作为它的第二个参数。
<script>
const A = {
name : 'apple',
showName: function(param1,param2,param3){
console.log(this.name,param1,param2,param3)
}
}
let pear = {name: 'pear'};
A.showName.apply(pear,['ppp','kkk','sss']); //pear ppp kkk sss
</script>
apply()的参数为空时,默认调用全局对象
绑定bind
bind相比于call而言,并不是马上调用函数和直接改变函数的上下文,而是返回改变上下文之后的函数。 区别在于立即执行还是等待执行,
<script>
const A = {
name : 'apple',
showName: function(param1){
console.log(this.name,param1)
}
}
let pear = {name: 'pear'}
const method = A.showName.bind(pear,'aa');
//method();
</script>
我们可以从控制台中看到,虽然使用了bind方法,但是实际上方法并没有马上执行,当我们把method()方法前的注释去掉后,我们就可以看到方法正式被调用了。
也就是说,bind相比于其他两个方法来说,主要的区别在于执行的时机不同,bind相当于是重新生成了一个方法,且该方法只有在真正被调用的时候才会被执行,执行bind方法本身并不会触发方法调用
参考[call、apply、bind的用法和区别 - 简书 (jianshu.com)]