JS 函数实际上是一段可以随时随地运行的代码块。定义函数的目的主要是为了更好地重用代码以及事件处理。在 JavaScript 中,函数分为内置函数和用户自定义函数。
自定义函数由用户根据需要自行定义,可以定义两类函数:有名函数和匿名函数。自定义 JS 函数需要使用关键字 function,定义有名函数时需要指定函数名称,定义匿名函数则不需要指定函数名称。
有名函数的定义也叫函数声明,基本语法如下:
匿名函数的定义有两种形式:函数表达式形式和事件注册形式。
函数表达式形式的定义基本语法如下:
函数表达式将匿名函数赋给一个变量,这样调用匿名函数就可以通过这个变量来调用。
事件注册形式的定义基本语法如下:
说明如下:
1) 定义有名函数时必须指定函数名。
2) 函数名:可任意定义,但必须符合标识符命名规范,且不能使用 JavaScript 的保留字和关键字。函数名一般首字母小写,通常是动名词,最好见名知意。如果函数名由多个单词构成,则单词之间使用下划线连接,如 get_name,或写成驼峰式,如 getName。
3) 参数列表:可选。它是用小括号括起来的 0 个以上的参数,用于接收调用函数的参数传参。没有参数时,小括号也不能省略;如果有多个参数,参数之间用逗号分隔。此时的参数就是一个变量,没有具体的值,因而称为虚参或形参。虚参在内存中没有分配存储空间。在进行参数传递时,虚参可以接受任意类型的数据。
4) 函数体:由大括号{}括起来的语句块,用于实现函数功能。调用函数时将执行函数体语句。
5) return[表达式]:可选。执行该语句后将停止函数的执行,并返回指定表达式的值。其中的表达式可以是任意表达式、变量或常量。如果没有 return 语句或缺省表达式,函数将返回 undefined 值。
6) 事件注册形式定义的匿名函数通常不需要 return 语句。
当一个函数需要在多个地方调用时,需要定义为有名函数或函数表达式,而只用来处理一个对象的某个事件时则通常使用事件注册定义形式的匿名函数。
需要注意的是,从变量提升内容的介绍中,我们知道,有名函数的作用域可以提高到最前面,所以有名函数可以在定义前使用,而函数表达式则必须在定义后才可以使用。
【例 1】定义带 return 语句的有名函数。
<script>
function getMax(a,b){
if(a>b){
return a;
}else{
return b;
}
}
</script>
上述代码定义了名为 getMax 的函数,其中有两个虚参 a 和 b,函数体中有两个 return 语句,当 a 大于 b 时返回 a 值;否则返回 b 值。
【例 2】定义不带 return 语句的有名函数。
<script>
function sayHello(name){
alert("Hello, " + name);
}
</script>
上述代码定义了名为 sayHello 的函数,虚参为 name,函数体中没有返回值,调用函数时会弹出警告对话框。
【例 3】定义函数表达式。
<script>
var getMax = function(a,b){
if(a>b){
return a;
}else{
return b;
}
}
</script>
上述代码将一个匿名函数赋给了变量 getMax,虚参和函数体功能和例 1 完全一样。
【例 4】对事件注册匿名函数。
<script>
window.onload = function(){
alert("hi");
};
</script>
上述代码对窗口的加载事件注册了一个匿名函数,这样文档窗口一加载完成,将立即执行该匿名函数弹出警告对话框。