this在js中是至关重要的,相信很多人在这个上面都栽过跟头,众所周知apply、call和bind都是用来在函数执行过程中手动去改变this指向问题,那么具体怎么使用有啥区别呢?
三者相似点
- 1、都是用来改变函数的this对象的指向的。
- 2、第一个参数都是this要指向的对象。
- 3、都可以利用后续参数传参。
this指向
我觉得首先有必要用实例来说个我们经常用的函数中可能忽略的概念,例如:
分析,我们如何理解上面这段代码?可能有人听的最多的就是this就是当前谁调用指向谁,好像是那么回事,不讨论,其实我们通过融入apply、call或者bind去理解上面这段代码,例如:
深入浅出
三者差异
xm.say.call(xc,"实验小学","六年级"); //小翠在实验小学上六年级 |
1 | xm.say.apply(xc,["实验小学","六年级"]); //小翠在实验小学上六年级 |
1 | xm.say.bind(xc,"实验小学","六年级")(); //小翠在实验小学上六年级 |
但是由于bind返回的仍然是一个函数,所以我们还可以在调用的时候再进行传参。
1 | xm.say.bind(xc)("实验小学","六年级"); //小翠在实验小学上六年级 |
小结
居上示例总结:call后面的参数与say方法中是一一对应的,而apply的第二个参数是一个数组,数组中的元素是和say方法中一一对应的,这就是两者最大的区别。那么bind怎么传参呢?它可以像call那样传参,bind比较特殊,bind返回的仍然是一个函数,所以我们还可以在调用的时候再进行传参。
我要坐在有阳光的地方,像猫舔奶碗那样一字不漏地把报纸上下看遍左右看遍,然后把世人在阳光下开展的各种生之片段吸入体内,滋润每一个细胞。——村上春树《世界尽头与冷酷仙境》