在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)); //传入调用的参数,参数长度是不定的