bind()、call()、apply()相同点:
1、三者都可以改变函数this的指向问题
2、三者的第一个参数都是this要指向的对象,也就是想指定的上下文
3、三者都可以利用后续参数传参
bind()、call()、apply()不同点:
bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 。
call()和apply()
call() 和 apply() 的作用就是间接调用方法或函数,并将方法或函数内部的this动态绑定到对象身上。
call() 和 apply() 方法的异同:
不同:传参形式不同 ,call() 以列表的形式传参,apply() 以数组的形式传参
2 call和apply的参数。
从第1点我们已经分析出了call和apply的第一个参数的意义。它不是给被调用的方法或函数传递的。
而是用来绑定到方法和函数内部的this的。那如果方法和内部里面没有用到this怎么办呢?传null。
例如: function add(){ alert(“123456”); } 对于这个函数
add(); 和 add.call(null); 和 add.apply(null); 效果完全一样。
那么,如何给被调用的方法或函数传递参数呢?从第二个参数开始。
对于call:它是以有序的参数列表传递给方法和对象的。所以你被调用的方法有多少个形参,
你的call从第二个参数开始就要传递多少个实参。
对于apply:它是以数组的形式封装参数的。即把方法或函数需要的所有参数。用一个
数组的形式全部装起来。实际使用的时候,会从数组下标为0的位置一一开始
取出实参。
3 异同:
3.1如果需要绑定this,并且被调用的函数和方法需要传参:
xxx.call(对象,p1,p2,…pn); <=> xxx.apply(对象,[p1,p2,…pn]);
3.2如果需要绑定this,并且被调用的函数和方法不需要传参:
xxx.call(对象); <=> xxx.apply(对象);
3.3如果不需要绑定this,并且被调用的函数和方法需要传参:
xxx.call(null,p1,p2,…pn); <===> xxx.apply(null,[p1,p2,…pn]);
3.4如果不需要绑定this,并且被调用的函数和方法不需要传参:
xxx.call(null); <=> xxx.apply(null); <=> xxx.call();<=>xxx.apply();