apply,call,bind的区别
首先,每个函数都包含两个非继承而来的方法,call和apply,而这两个方法的作用及其相似,即均为在特定的作用域中调用函数,即设置this的值
- **传递参数
- **扩充函数赖以运行的作用域
apply
apply方法接收两个参数,第一个参数为制定函数的执行作用域,第二个参数是一个数组,可以是Array实例,也可以是一个arguments对象。如:
function add(arg1,arg2){
return arg1+arg2;
}
function applyadd1(arg1,arg2){
return add.apply(this,[arg1,arg2]);
}
function applyadd2(arg1,arg2){
return add.apply(this,arguments);
}
call
call方法与方法的作用完全一样,只是传递参数的方法不同,apply的第二个参数是数组,而apply除了第一个参数为绑定的执行作用域外,其余参数都直接传递给函数,即在使用call方法时,传递给函数的参数必须逐个列举出来,如下:
function calladd(arg1,arg2){
return add.apply(this,arg1,arg2);
}
设置this的值
传递参数并不是apply和call的真正意义,它们真正强大的作用在于可以扩充函数赖以运行的作用域,即改变this的值,如下
window.age=12;
var obj={o:15};
function showage(){
alert(this.age);
}
showage()//12;
showage.call(o);//15
showage.apply(window);//15
使用call和apply来扩充作用域的最大好处是,不需要函数和对象之间存在耦合的关系,即不需要将函数放在对象中。
bind
bind会绑定this的值,在绑定作用域方面类似call和apply,不同的是,bind会返回一个函数的实例,只要将这个返回值赋给一个变量,以后再调用这个生成的函数,作用域总是当时绑定的作用域(可以理解为apply,call只是一次性的,而bind是生成一个新的不同作用域的函数,以后可以随时调用),如
window.age=12;
var obj={o:15};
function showage(){
alert(this.age);
}
var showageofo=showage.bind(o);
showage()//12;
showageofo();//15