call和apply、bind但是用来改变this的指向的,但也有一些小小的差别。下面我们来看看它们的差别在哪。
call的作用就是改变this的指向的,第一个传的是一个对象,就是你要借用的那个对象。
function fn(a,b,c,d){
console.log(a,b,c,d);
}
//call
fn.call(null,1,2,3);
//apply
fn.apply(null,[1,2,3]);
//bind
var f = fn.bind(null,1,2,3);
f(4);
结果如下:
1 2 3 undefined
1 2 3 undefined
1 2 3 4
前面说过第一个参数传的是一个你要借用的对象,但这么我们不需要,所有就传了一个null,当然你也可以传其他的,反正在这里没有用到,除了第一个参数后面的参数将作为实际参数传入到函数中。
call就是挨个传值,apply传一个数组,bind也是挨个传值,但和call和apply还有多少不同,使用call和apply会直接执行这个函数,而bind并不会而是将绑定好的this重新返回一个新函数,什么时候调用由你自己决定。
var objName = {name:'JS2016'};
var obj = {
name:'0 _ 0',
sayHello:function(){
console.log(this.name);
}.bind(objName)
};
obj.sayHello();//JS2016
这里也就是为什么我要用bind的原因,如果用call的话就会报错了。自己想想这个sayHello在obj都已经执行完了,就根本没有sayHello这个函数了。
var objName = {name:'JS2016'};
var obj = {
name:'0 _ 0',
sayHello:function(){
console.log(this.name);
}.call(objName)
};
obj.sayHello();//JS2016
JS2016
VM320:8 Uncaught TypeError: obj.sayHello is not a function
at <anonymous>:8:5
下面的方法使用 apply
方法寻找一个数值数组中的最大元素。getMaxOfArray([1,2,3])
等价于 Math.max(1, 2, 3),但是你可以使用
getMaxOfArray`()作用于任意长度的数组上。
function getMaxOfArray(numArray) {
return Math.max.apply(null, numArray);
}
或者通过使用最新的扩展语句spread operator
,获得数组中的最大值变得更容易。
var arr = [1, 2, 3];
var max = Math.max(...arr);
又或者你想让伪数组调用数组的方法
function fn(){
[].push.call(arguments,3);
console.log(arguments); //[1, 2, 3]
}
fn(1,2);
再者:
var arr = ['aaabc'];
console.log(''.indexOf.call(arr,'b')); //3
bind在某些浏览器下不兼容