程序员

javascript 中的apply和call方法

在javascript模式设计的学习中,深感javascript的语法的灵活性,在模式设计的方法中对于高阶函数的使用到了令人发指的地步,几乎每个示例中都离不开函数作为参数的调用方法,apply和call方法是使用最多的。这两个函数调用形式不太一样,但是目的都是一样的。apply和call函数是javascript中的硬绑定方式,可以灵活,动态的改变函数运行时候的作用域对象。并且和argument对象结合起来使用,威力会更大。
结合《javascript函数式编程》的一个例子说说。 p2
使用apply方法可以创建一个函数,他接收另一个函数,并且返回另一函数,该函数接受一个数组,并用apply来执行函数

function  splat(fun){ //splat函数接受一个函数作为参数
  return function(array){ //返回另一个函数,array作为形参
     return fun.apply(null,array);//apply方法传入数组参数
  };
}
var addArrayElements=splat(function(x,y){return x+y;}); //传入函数加
//法函数作为参数

addArrayElements([1,2]); //调用函数,=>3

另外一个展现js灵活性的地方是,我们可以随时以任意多个任意类型的参数来调用任意一个函数。这里的三个任意体现了js函数使用的灵活性。
每个js函数都可以访问一个arguments局部对象,他类似数组,存储了调用函数是的实际参数。

   function  unsplat(fun){//接受一个函数作为参数
  return function(){//返回另一个函数
     //返回的函数为传入的函数绑定arguments对象,这里经过
     //underscore的toArray方法转为数组对象
     return fun.call(null,_.toArray(arguments));
  };
}
var joinElements=unsplat(function(array){return array.join(' ');}); //调用
//时传入函数实参

alert(joinElements(1,2)); //传入调用的参数,参数长度是不定的
这两个方法在模式设计的代码里用的太多了,所以要好好研究研究.