1. 匿名函数实例:
>>> function ( a ){ return a; }
匿名函数也就是说没有方法名。
2. 匿名函数的主要用法:
2.1 我们可以将匿名函数作为参数传递给其它函数,这样,接收方函数就能利用我们所传递的函数来完成某些事情。
2.2 我们可以定义某个匿名函数来执行某些一次性任务。
3. 接下来,我们来看具体的应用示例,通过其中的细节来进一步了解匿名函数。
3.1 回调函数
①. 解释: 当我们将函数A 传递给函数B ,并由B 来执行A 时,A 就成了一个 回调函数(callback function)。
如果这时A 还是一个无名函数,那么我们就称它为 匿名回调函数。
②. 回调函数的优势:
>>1. 它可以让我们在不做命名的情况下传递函数(这意味着可以节省全局变量)。
>>2. 我们可以将一个函数调用操作委托给另一个函数(这意味着可以节省一些代码编写工作)。
>>3. 它们也有助于提升性能。
③. 回调示例:
function multiplyByTwo(a , b , c) {
var i ,ar = [ ] ;
for ( i = 0 ; i < 3 ; i++) {
ar [ i ] = arguments [ i ] * 2;
}
return ar;
}
function addOne( a ) {
return a +1 ;
}
现在,我们来测试一下这两个函数:
>>> multiplyByTwo( 1, 2, 3 );
运行结果:[ 2, 4 ,6 ]
>>> addOne( 100 );
运行结果:101
接下来,我们要实现这三个元素在两个函数之间的传递,这需要定义一个用于存储元素的数组。我们先从multiplyByTwo ( ) 的调用开始:
>>> var myarr = [ ] ;
>>> myarr = multiplyByTwo ( 10 , 20 ,30 );
运行结果: [ 20 , 40 ,60 ]
然后,用循环遍历每个元素,并将它们分别传递给 addOne() 。
>>> for ( var i =0 ; i < 3; i++ ) { myarr [ i ] = addOne (myarr [ i ] );}
>>> myarr
运行结果: [21 ,41, 61]
如您所见,这段代码可以工作,但是显然还有一定的改善空间。特别是这里使用了两个循环,如果数据量很大或循环操作很复杂的话,开销一定不小。因此,我们需要将它们合二为一。这就需要对multiplyByTwo() 函数做一些改动,使其接受一个回调函数,并在每次迭代操作中调用它。具体如下:
function multiplyByTwo (a , b, c, callback) {
var i , ar = [ ];
for ( i = 0 ; i< 3 ; i ++){
ar [ i ] = callback(arguments [ i ] * 2);
}
return ar;
}
函数修改完成后,之前的工作只需要一次函数调用就够了,我们只需像下面初始值和回调函数传递给它即可:
>>> myarr = multiplyByTwo ( 1 ,2 ,3, addOne );
运行结果:[ 3, 5, 7]
我们还可以用匿名函数来代替addOne(),这样做可以节省一个额外的全局变量。
>>> myarr = multiplyByTwo( 1, 2, 3, function (a ) { return a + 1} );
运行结果:[3 , 5 , 7]
而且,使用匿名函数也更易于随时根据需求调整代码。例如:
>>> myarr = multiplyByTwo ( 1 ,2 ,3, function( a ) { return a + 2; } );
运行结果:[4, 6, 8]
3.2 自调函数
目前我们已经讨论了匿名函数在回调方面的应用。接下来,我们来看匿名函数的另一个应用示例——这种函数可以在定义后自行调用。比如:
{
function (){
alert( 'boo' );
}
}( )
这种语法看上去有点吓人,但其实很简单——我们只需要将匿名函数的定义放进一对括号中,然后外面再紧跟一对括号即可。其中,第二对括号起到是“立即调用”的作用,同时它也是我们向匿名函数传递参数的地方。
(
function ( name ) {
alert( ' hello ' + name + ' ! ');
}
)('dude')
使用自调匿名函数的好处在于这样不会产生任何全局变量。当然,缺点是这样的函数是无法重复执行的(除非您将它放在某个循环或其它函数中)。这也使得匿名自调函数最适合于执行一些一次性的或初始化的任务。
函数篇之——函数也是数据