call apply bind
相同点:
首先这三个都是改变函数的this指向的,都可以后续传参
区别:
1、调用
function fun(a, b) { alert(this.name); } var obj = { name: "obj", sayName: function () { alert(this.name); } }; var obj2 = { name: "obj2" }; fun.call(obj2)
alert的答案是obj2,此时this指向了obj2
对于apply可以这样:
fun.apply(obj2)
对于bind需要这样:
fun.bind(obj)()
因为bind方法返回的是一个函数,不会立即执行,需要()这样调用执行
2、传参
call()方法可以将实参在对象之后依次传递
fun.call(obj,2,3);
apply()方法需要将实参封装到一个数组中统一传递
fun.apply(obj,[2,3]);
bind在调用的时候传参
fun.bind(obj)(2, 3)
深入理解:
想要知道call是怎样被执行的,涉及到了原型链查找机制。
fun.call(obj)
其实是首先通过fun的原型链,找到Function.ptototype中的call方法,call方法中的this指向的就是fun,然后在执行call方法的时候,改变了this的指向,成了obj
相关推荐
chunianyo 2020-06-04
xjp 2020-05-26
Alanxz 2020-03-04
歆萌 2020-02-10
APCDE 2019-12-10
lzzyok 2020-10-10
无情的你无情的雨 2020-06-16
grantlee 2020-05-28
Roka 2020-05-25
天空一样的蔚蓝 2020-05-02
nangongyanya 2020-04-19
shufen0 2020-04-14
humanbeng 2020-03-05
liwf 2020-02-17
tianchaoshangguo 2020-01-04
julien 2020-01-02
齐天大圣数据候 2019-12-28
杨友山 2019-12-25
GavinZhera 2019-12-19