函数是一组可以随时随地运行的语句,它们是ECMAScript的核心。函数由关键字function、函数名加一组参数以及置于括号中要执行的代码声明的。
函数的基本语法如下:
function functionName (arg0, arg1, ... ,argN) { statements }
如果函数无明确的返回值,或调用了没有参数的return语句,那么它真正返回的值是undefined。
1、无重载
ECMAScript中的函数不能重载。可以使用相同的名字在同一个作用域中定义两个函数,而不引发错误,但真正使用的是最后一个函数。
2、arguments对象
在函数代码中,使用特殊对象arguments,开发者无需明确指出参数名,就能访问它们。arguments[0]表示第一个参数(第一个参数位于位置0,第二个参数位于位置1,依此类推)。因此无需明确命名参数,就可以重写函数。
使用arguments对象检测传递给函数的参数个数,引用属性arguments.length。
使用arguments对象判断传递给函数的参数个数,即可模拟函数重载。
function doAdd () { if (arguments.length == 1) { alert(arguments[0] + 10); } else if (arguments.length == 2) { alert(arguments[0] + arguments[1]); } }
3、Function类
Function类可以表示开发者定义的任何函数。用Function类直接创建函数的语法如下:
var function_name = new Function (argument1, argument2, argument3, ... , argumentN, function_body);
尽管可用Function构造函数创建函数,但最好不要使用它,用它定义函数比用传统方式要慢得多。不过,所有函数都应看作是Function类的实例。
因为函数是引用类型,所有它们也有属性和方法。ECMAScript定义了属性length声明了函数期望的参数个数。
function doAdd(iNum) { alert(iNum + 10); } alert(doAdd.length); // outputs "1"
ECMAScript函数可以接受任意多个参数(最多25个),属性length只是为了查看默认情况下预期参数个数提供了一种便捷的方式。
Function对象也有与所有对象共享的标准valueOf()方法和toString()方法。这两个方法返回的都是函数的源代码,在调试时尤其起作用。
4、闭包
闭包是指词法表示包括不必计算的变量的函数。即该函数可以使用函数外定义的变量。
在ECMAScript中使用全局变量是一个简单的闭包实例。
var message = "Hello World"; function() { alert(message); }