JavaScript基础——函数
1、定义函数
定义函数的方法有两种:
1)使用function语句声明函数。
2)通过Function对象来构造函数
使用function来定义函数有两种方式:
// 方式一:命名函数
function fn(){
// 函数体
}
// 方式二:匿名函数
var f = function(){
// 函数体
}
命名函数的方法也被称为声明式函数,而匿名函数的方法也被称为引用式函数或者函数表达式,即把函数看做一个复杂的表达式,并把表达式赋予给变量。
使用Function对象构造函数的语法如下:
var function_name = new Function(arg1,argg2,...argN,function_body)
在上面语法形式中,每个arg都是一个函数参数,最后一个函数是函数主体(要执行的代码)。Function()的所有参数必须是字符串。
实例1:通过Function构造函数定义了一个自定义函数,该函数包含两个参数,在函数主体部分使用document.write()方法把两个参数包裹在<h1>标签中输出
实例2:在实际开发中,使用function定义函数要比Function构造函数方便,且执行效果更高。Function仅用于特定的动态环境中,一般不建议使用。针对上面实例,可以把它转换为function定义函数的方式;
调用函数
调用函数使用小括号运算符来实现。在括号运算符内部可以包含多个参数列表,参数之间通过逗号进行分隔。
实例:在以下实例中使用小括号调用函数f,并把返回值传递给document.write()方法。
提示:一个函数可以包含多个return语句,但是在调用函数时只有第一个return语句被执行,且该return语句后面的表达式的值作为函数的返回值被返回,return语句后面的代码将被忽略掉。
函数参数
参数可以分为两种:形参和实参
形参就是在定义函数时,传递给函数的参数,被称为形参,即形式上的参数。
实参就是当参数被调用时,传给函数的参数,这些参数被称为实参。
实例:在以下实例函数中,参数a和b就是形参,而调用函数中的23和34就是实参。
函数的形参没有限制,可以包括零个或多个,函数形参的数量可以通过函数的length属性获取。
一般情况下,函数的形参个数和实参个数是相等的,但JavaScript没有规定两者必须相等,如果形参数大于实参数,则多出的形参值为undefined;相反如果实参数大于形参数,则多出的实参就无法被形参变量访问,从而被忽略掉。
实例:在以下实例中,如果在调用函数时,传递3个实参值,则函数将忽略第3个实参的值,最后提示的结果为57.
实例:在以下实例中,在调用函数时,仅输入1个实参,这时,函数就把第2个形参的值默认为undefined,然后使用undefined与2相加,由于任何值与undefined进行运算的结果都将返回NaN(无效的值).
拓展
JavaScript定义了arguments对象,利用该对象可以快速操纵函数的实参。使用arguments。length可以获取函数实参的个数,使用数组下标(arguments[n])可以获取实际传递给函数的每个参数值。
实例:在以下实例中,为了预防用户随意传递参数,可以在函数体检测函数的形参和实参是否一致,如果不一致可以抛出异常,如果一致则执行正常的运算。
在函数add()中增加了一个条件检测,来判断函数的形参和实参的数量是否相同。如果不相同,则抛出一个错误信息对象;如果相同,则返回参数的和。然后调用函数,并利用异常处理语句(try/catch)来捕获错误信息,并在提示对话框中显示出来。
函数应用
1、匿名函数
匿名函数就是没有名称的函数,它相当于一个复杂的表达式。当只需要一次性使用函数时,使用匿名函数会更加有效率。
实例:在以下实例中匿名函数被调用之后,被赋予给变量z,然后提示z变量的返回值
闭包函数
闭包是一个拥有许多变量和绑定了这些变量的环境表达式(通常是一个函数),因而这些变量也是该表达式的一部分。闭包函数就是外部函数被调用后,它的变量不会消失,仍然被内部函数所使用,而且所有的内部函数都拥有对外部函数的访问权限。
实例:在下面实例中,定义一个函数a,该函数包含一个私有函数b。内部函数b把自身参数m递加给外层含函数的私有变量n上,然后返回n的值。外层函数a的返回值为内部函数b,从而形成了一种内层引用外层的闭包关系,于是外层函数就是一个典型的闭包函数。
这样当在全局作用域中反复调用内部函数时,将会不断把参数值递加给外层函数的私有变量n身上,形成闭包对外部函数的私有变量长时保护作用。如果没有闭包函数的作用,当调用外部函数a之后,其定义的私有变量就不在存在,也就无法实现值得递增效果。