JavaScript中定义函数的方式有两种:一种是函数声明,另一种就是函数表达式。
函数声明
function functionName(arg0, arg1, arg2){
//function body
}
首先是function关键字,然后是函数的名字,接着是函数的参数列表,然而在访问函数的时候,实际上仅仅匹配函数的名字,而不用匹配参数列表的,在函数内部,是使用arguments数组来存储参数的。
关于函数声明,它的一个重要特征就是函数声明提升(function declaration hoisting), 意思就是在执行代码之前会先读取函数声明。这就意味着可以把函数声明放在函数调用的语句之后(但是不推荐这么做)。
sayHi();
function sayHi(){
console.log("Hi!");
}
这个例子不会抛出错误,因为在代码执行之前会先读取函数声明。
函数表达式
函数表达式有几种不同的语法形式。
最常见的一种:
var functionName = function(arg0, arg1, arg2){
//function body
};
这种形式是创建一个匿名函数(anonymous function),并将其赋值给变量functionName。匿名函数在关键字function后面没有标识符,也叫lambda表达式。
函数表达式与其他表达式一样,在使用之前必须先复制。以下代码会抛出错误。
sayHi();
var sayHi = function(){
console.log("Hi!");
}
理解函数声明提升的关键,就是理解函数声明和函数表达式之间的区别。
函数可以被创建并赋值给变量,这个变量可以作为另一个函数的参数,也可以作为其他函数的返回值。这样的lambda表达式的特性使得JavaScript支持高阶函数和闭包。
高阶函数
在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:
- 接受一个或多个函数作为输入
- 输出一个函数
闭包
官方”的解释是:
闭包,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
JavaScript的闭包需要结合其作用域链一起理解。简单来说:
闭包,就是有权访问另一个函数作用域中变量的函数。创建闭包的常见方式,就是在一个函数A内部创建函数B,这个函数B就是一个闭包,有权访问函数A的所有变量。