JavaScript的函数call和apply的区别、以及bind方法
2016-11-24 14:30
861 查看
1、call和apply的定义和区别
call和apply的作用一样,唯一不同的是:接受的参数不同。
apply:方法能够劫持另一个对象的方法,继承另一个对象的属性。
Funciton.apply(obj,arguments)
obj:对象,替代Function类里面的this对象
arguments:数组
call的用法:
Function.call(obj,[param1[,param2[,....,param3]]]
obj:Function类里面的this对象
params:参数列表
2、[b]call和apply的用法示例[/b]
//定义一个Animal的类
function Animal(name,age){
this.name = name;
this.age = age;
}
//定义一个Cat的类
function Cat(name,age,kind){
Animal.apply(this,arguments); //调用Animal的方法,并将里面的this对象,转化成Cat实例
this.kind = kind;
}
var cat = new Cat("miao",8,"cat");
call示例,将上面代码变成Animal.call(this,name,age);其他的保持不变,这就是差别。
3、 什么情况下用apply,什么情况下用call
在给对象参数的情况下,如果参数的形式是数组的时候,比如apply示例里面传递了参数arguments,这个参数是数组类型,
并且在调用Animal的时候参数的列表是对应一致的(也就是Animal和Cat的参数列表前两位是一致的) 就可以采用 apply ,
如果我的Animal的参数列表是这样的(age,name),而Cat的参数列表是(name,age,kind),这样就可以用call来实现了,
也就是直接指定参数列表对应值的位置(Person.call(this,age,name,kind));
4、 巧用apply
apply的一些其他巧妙用法 通过以上示例可以看出apply可以将一个数组默默的解析成一个一个的参数,
可以将一个数组默认的转换为一个参数列表([param1,param2,param3] 转换为 param1,param2,param3) ,
利用aplly这个特点我们就可以用在一些针对字符串操作的方法了:例如:
a) Math.max 可以实现得到数组中最大的一项
因为Math.max参数不支持数组,但是支持Math.max(param1,param2,parma3,....)
所以var max = Math.max.apply(null,arrary),就可以轻易得到一个数组中最大的一项。
b)Array.prototype.push 可以实现两个数组的合并
var arr1 = new Array(1,2,3,5,6);
var arr2 = new Array(7,8,9,0);
Array.prototype.push.apply(arr1,arr2);
console.log(arr1); // [1, 2, 3, 5, 6, 7, 8, 9, 0]
5、bind方法:绑定函数内部的this
末尾略微提一下bind方法,是ES5新出的,它主要是绑定函数内部的this,示例
window.color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue
将this绑定在o对象上,改变函数内部的this指向。
支持bind()方法的浏览器有 IE9+、Firefox 4+、Safari 5.1+、Opera 12+、 Chrome。
参考链接:
http://www.cnblogs.com/xiaohongwu/archive/2011/06/15/2081237.html
https://segmentfault.com/a/1190000004159030
call和apply的作用一样,唯一不同的是:接受的参数不同。
apply:方法能够劫持另一个对象的方法,继承另一个对象的属性。
Funciton.apply(obj,arguments)
obj:对象,替代Function类里面的this对象
arguments:数组
call的用法:
Function.call(obj,[param1[,param2[,....,param3]]]
obj:Function类里面的this对象
params:参数列表
2、[b]call和apply的用法示例[/b]
//定义一个Animal的类
function Animal(name,age){
this.name = name;
this.age = age;
}
//定义一个Cat的类
function Cat(name,age,kind){
Animal.apply(this,arguments); //调用Animal的方法,并将里面的this对象,转化成Cat实例
this.kind = kind;
}
var cat = new Cat("miao",8,"cat");
call示例,将上面代码变成Animal.call(this,name,age);其他的保持不变,这就是差别。
3、 什么情况下用apply,什么情况下用call
在给对象参数的情况下,如果参数的形式是数组的时候,比如apply示例里面传递了参数arguments,这个参数是数组类型,
并且在调用Animal的时候参数的列表是对应一致的(也就是Animal和Cat的参数列表前两位是一致的) 就可以采用 apply ,
如果我的Animal的参数列表是这样的(age,name),而Cat的参数列表是(name,age,kind),这样就可以用call来实现了,
也就是直接指定参数列表对应值的位置(Person.call(this,age,name,kind));
4、 巧用apply
apply的一些其他巧妙用法 通过以上示例可以看出apply可以将一个数组默默的解析成一个一个的参数,
可以将一个数组默认的转换为一个参数列表([param1,param2,param3] 转换为 param1,param2,param3) ,
利用aplly这个特点我们就可以用在一些针对字符串操作的方法了:例如:
a) Math.max 可以实现得到数组中最大的一项
因为Math.max参数不支持数组,但是支持Math.max(param1,param2,parma3,....)
所以var max = Math.max.apply(null,arrary),就可以轻易得到一个数组中最大的一项。
b)Array.prototype.push 可以实现两个数组的合并
var arr1 = new Array(1,2,3,5,6);
var arr2 = new Array(7,8,9,0);
Array.prototype.push.apply(arr1,arr2);
console.log(arr1); // [1, 2, 3, 5, 6, 7, 8, 9, 0]
5、bind方法:绑定函数内部的this
末尾略微提一下bind方法,是ES5新出的,它主要是绑定函数内部的this,示例
window.color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue
将this绑定在o对象上,改变函数内部的this指向。
支持bind()方法的浏览器有 IE9+、Firefox 4+、Safari 5.1+、Opera 12+、 Chrome。
参考链接:
http://www.cnblogs.com/xiaohongwu/archive/2011/06/15/2081237.html
https://segmentfault.com/a/1190000004159030
相关文章推荐
- 深入理解JavaScript中的call、apply、bind方法的区别
- JavaScript方法call,apply,caller,callee,bind的使用详解及区别
- 函数的call、apply以及bind的作用与区别
- javascript this 和 es6 箭头函数this 的理解以及call()、apply()、bind()的用法
- JavaScript方法call,apply,caller,callee,bind的使用详解及区别
- JavaScript之call,apply,bind方法的区别和共同点
- javascript 函数方法apply()和call()的共同点和区别
- JavaScript方法call,apply,caller,callee,bind的使用详解及区别
- 深入理解JavaScript中的call、apply、bind方法的区别
- JavaScript中的call、apply、bind方法的区别
- JavaScript之apply,call以及bind方法
- JavaScript apply、call、caller、callee、bind使用方法与区别分析
- JavaScript方法call,apply,caller,callee,bind的使用详解及区别
- 函数中的this指向,以及 修改this指向的 call/apply/bind方法
- JavaScript方法call,apply,caller,callee,bind的使用详解及区别
- javascript中call、apply、bind方法的区别
- JavaScript方法call,apply,caller,callee,bind的使用详解及区别
- js---js中的继承方法call、bind、apply,以及三者之间的区别总结。
- JavaScript方法call,apply,caller,callee,bind的使用详解及区别
- JavaScript方法call、apply、caller、callee、bind的使用详解及区别