JS中函数的传递(二)匿名函数

在JS函数传递的过程中,还有一种很重要的类型,便是匿名函数。当然,匿名函数的用途远不只函数传递,但本文仅对它在函数传递中的作用做一个简单的说明。

以下两个代码在效果上是基本等价的:

/*作者:Vilic Vane 博客:www.vilic.info*/
function abc(func)
{
func();
}

//代码1
function test()
{
alert(“Hello!”);
}
abc(test);

//代码2
abc(function(){alert(“Hello!”);});

可以看出,有时候通过书写匿名函数,可以节省代码量,但在有些时候,则会降低程序的可读性。关于匿名函数还有一个常用的技巧,即通过匿名函数(当然如果你愿意,或者函数较为复杂时,可以像上面的代码1那样单独书写一个函数)传递参数。那么,什么时候会用到呢?拿setTimeout来说,setTimeout有两个主要参数,一个是表达式或函数,一个是时间。通常,我们更多使用的是函数而不是表达式。但因为传递的函数是一个变量,所以,我们无法为它简单的加上参数,这个时候,JS闭包的优势就体现出来了。

setTimeout(function(){abc(/*参数在这里*/);}, 500);

顺便说到闭包,就提一下,看到很多地方说避免用闭包,其实我觉得闭包很有用,可以大大节省参数的传递成本。但前提是,必须有声明变量的好习惯。记得有一次发现自己Prever Start的图标排列的间隔总是和最后一个实例一样(当然一开始没发现得那么具体),才意识到是自己忘记了声明一个变量,自然,它也便成了全局变量了。