JavaScript中call和apply的区别

这两个方法不经常用,但是在某些特殊场合中是非常有用的,下面主要说下它们的区别:

1、首先,JavaScript是一门面向对象的语言,也就是说它有this的概念。而且JavaScript是一门动态类型语言,为什么说它是动态类型语言呢?因为JavaScript在编译时没有类型检查的过程,不会去检查创建的对象类型,也不会去检查传递的参数类型,所以它的变量类型在运行期间是可以改变的。

2、要知道call和apply都是为了改变某个函数运行时的上下文(context)而存在的,也就是为了改变函数,也可以说是对象(函数本身就是对象)内部this的指向而存在的。

3、二者区别为:传参数的方式不一样,如下:

func.call(this, arg1, arg2);
func.apply(this, [arg1, arg2]);

上面也很清楚了,call传参数时,明确知道时几个参数或者参数较少时,比如arg1、arg2,挨个传就是了;

而apply第二个参数必须为一个数组,即将参数放进数组中即可。

4、实例

(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_中传入参数时,未能得到值,而是将值存储起来,直到当无参数传入时,输出结果。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值