6.函数也是数据
对JavaScript来说,函数是一种数据类型,只不过这种特殊的数据类型有两个重要特性:
- 它们所包含的是代码
- 它们是可以执行的(或者说是可以调用的)
下面两种函数定义在本质上是相同的,typeof操作符返回的字符串将会是“function”。
function f(){return 1;} var f = function(){return 1;}
匿名函数
在JavaScript中,程序中可能存在下面这种数据片段。虽然代码看上去很奇怪,因为它实际上什么也做不了,但它是符合语法的,并不会引发任何错误。
“test”;[1,2,3];undefined;null;1
而且我们已经知道,函数在本质上与其他变量并无区别,因此它也可以在没有名字的情况下被使用:
function(a){return a;}
回调函数
既然函数可像其他数据那样赋值给某个变量,可以被定义、删除、拷贝,那么函数也可以当成参数传递给其他函数。
function multiplyByTwo(a,b,c,callback){ var i,ar=[]; for(i=0;i<arguments.length-1;i++){ ar[i]=callback(arguments[i]*2); } return ar; }
自调函数
( function(name){ alert('Hello'+name+'!'); } )('dudu')
第二对括号起到的作用是“立即调用”,使用自调匿名函数的好处在于这样不会产生任何全局变量。当然,这样的函数式无法重复执行的。这也使得匿名自调函数最适合于执行一些一次性的或初始化的任务。
内部(私有)函数
函数与其他类型的值,本质上是一样的,因此,没有什么理由可以阻止我们在一个函数内部定义另一个函数。
function a(param){ function b(theinput){ return theinput*2; } return 'The result is '+b(param); }
返回函数的函数
函数始终都会有一个返回值,即便不是显示返回,它也会隐式返回一个undefined。既然函数能返回一个唯一值,那么这个值就也有可能是另一个函数:
function a(){ alert('A!'); return function(){ alert('B!'); }; }