JavaScript 中 call 和 apply 用来调用函数, 那么 call 和 apply 的区别是什么? 下面本篇文章就来给大家介绍一下 call 和 apply 的区别, 希望对大家有所帮助.
apply: 调用一个对象的一个方法, 用另一个对象替换当前对象. 例如: B.apply(A, arguments); 即 A 对象应用 B 对象的方法.
call: 调用一个对象的一个方法, 用另一个对象替换当前对象. 例如: B.call(A, args1,args2); 即 A 对象调用 B 对象的方法.
这两个方法不经常用, 但是在某些特殊场合中是非常有用的, 下面主要说下它们的区别:
首先, JavaScript 是一门面向对象的语言, 也就是说它有 this 的概念. 而且 JavaScript 是一门动态类型语言, 为什么说它是动态类型语言呢?
因为 JavaScript 在编译时没有类型检查的过程, 不会去检查创建的对象类型, 也不会去检查传递的参数类型, 所以它的变量类型在运行期间是可以改变的.
要知道 call 和 apply 都是为了改变某个函数运行时的上下文 (context) 而存在的, 也就是为了改变函数, 也可以说是对象 (函数本身就是对象) 内部 this 的指向而存在的.
二者区别为: 传参数的方式不一样. call()方法接受逗号分隔的参数, 而 apply()方法接受参数数组.
如下:
- func.call(this, arg1, arg2);
- func.apply(this, [arg1, arg2]);
上面也很清楚了, call 传参数时, 明确知道时几个参数或者参数较少时, 比如 arg1,arg2, 挨个传就是了;
而 apply 第二个参数必须为一个数组, 即将参数放进数组中即可.
示例:
- (function(){
- Array.prototype.push.call(arguments, 4);//arguments 借用 Array.prototype.push 方法
- console.log( arguments ); // 输出: [1, 2, 3, 4]
- })(1, 2, 3);
- var currying = function(fn){
- var args = [];
- return function(){
- if( arguments.length === 0){
- return fn.apply( this, args);
- }
- else{
- [].push.apply( args, arguments);
- return arguments.callee; //callee 已弃用
- }
- }
- };
- var cost = (function(){
- var money = 0;
- return function(0{
- for(var i = 0,l - arguments.length;i<l;i++){
- money += arguments[i];
- }
- return money;
- }
- })();
调用:
- var cost_ = currying(cost); // 将 cost 转化成 curring 函数
- cost_(1); cost_(2); alert(cost_()); // 输出: 3
解释: 通过 currying(柯里化)的转化, 在 cost_中传入参数时, 未能得到值, 而是将值存储起来, 直到当无参数传入时, 输出结果.
来源: http://www.css88.com/qa/javascript/10958.html