函数的声明
函数可以封装语句,然后在任何地方、任何时间执行。JavaScript中函数使用function 关键字声明,后跟一组参数,然后是函数体。
一个函数定义(也称为函数声明,或函数语句)由一系列的[function]关键字组成,依次为:
- 函数的名称。
- 函数参数列表,包围在括号中并由逗号分隔。
- 定义函数的 JavaScript 语句,用大括号
{}括起来。
function add(a, b) {
return a + b;
}
如上所示代码是定义了一个简单的求和函数。
函数add使用了两个参数,这个函数只有一个语句,他说明该函数将参数a和b相加后返回,函数的return语句确定返回值。
函数声明会在任何代码执行之前就先被读取并添加到执行上下文。这个过程被称为函数声明提升。如果是使用函数表达式定义的函数,那么执行时就会出错。
console.log(add(1,2))//3
function add(a, b) {
return a + b;
}
虽然上面的函数声明在语法上是一个语句,但函数也可以由函数表达式创建。这样的函数可以是匿名的;它不必有一个名称。例如,函数add也可这样来定义:
var add=function(a,b){return a+b;};
var x=add(2,3),//x=5
ES6新增了使用胖箭头(=>)语法定义函数表达式。箭头函数实例化的函数对象与正式的函数表达式创建的函数对象行为是相同的。任何可以使用函数表达式的地方都可以使用箭头函数:
let add = (a,b) => {
return a+b;
};
如果只有一个参数,那也可以不用括号,只有没有参数和有多个参数的情况下,才需要使用括号。此外,箭头函数不能用作构造函数,箭头函数也没有prototype属性。
JavaScript中的函数没有重载,如果两个函数同名,那么后定义的函数就会覆盖先定义的。
函数的调用
定义一个函数并不会自动的执行它。定义了函数仅仅是赋予函数以名称并明确函数被调用时该做些什么。调用函数才会以给定的参数真正执行这些动作。例如,一旦你定义了函数add,你可以如下这样调用它:
add(2,3)
函数的参数
可以在函数的()中来指定一个或者多个形参,多个形参之间用逗号隔开,声明形参就相当于在函数内部声明了对应的变量但不赋值。
调用函数时传入实参,传入的形参会赋值给函数中对应的形参。调用函数时解析器不会检查实参的类型,所以要注意传入的实参。解析器不会检查实参数量,多余的实参不会使用。少的实参会对应的形参将是undefined。
函数中的this
this在标准函数和特殊函数中有不同的行为。
在标准函数中,this引用的是吧函数当成方法调用的上下文对象,这时候通常称其为this值(在网页的全局上下文中调用函数时,this指向windows)。
window.color='red';
let o={
color:'blue'
};
function sayColor(){
console.log(this.color);
}
sayColor();//red
o.sayColor=sayColor;
o.sayColor();//blue
定义在全局上下文中的函数引用了this对象。这个this指向哪个对象必须要等函数被调用时才能确定。
在箭头函数中,this指向的是定义箭头函数的上下文,即这个箭头函数是在哪个上下文中被定义的。
递归
递归函数通常形式就是一个函数通过名称实现自己调用自己。递归近似于循环。两者都重复执行相同的代码,并且两者都需要一个终止条件(避免无限循环或者无限递归)。
function fact(num){
if(num<=1){
return 1;
} else {
return num * fact(num-1);
}
}