函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。JavaScript函数语法,函数就是包裹在花括号中的代码块,前面使用了关键词 function: 当调用该函数时,会执行函数内的代码。可以在某事件发生时直接调用函数(比如当用户点击按钮时),并且可由 JavaScript 在任何位置进行调用。

函数的声明

  1. 定义式
    1
    2
    3
    4
    5
    fun(); // this is a function.
    function fun() {
    console.log('this is a function.')
    }
    fun(); // this is a function.
  2. 变量式
    1
    2
    3
    4
    demo(); // 报错:demo is not a function
    var demo = function () {
    console.log('this is a function.')
    }
    为什么这里在声明前调用会报错 demo is not a function 呢?而上面定义式的fun();又能在之前调用?
    javascript并不是严格的自上而下执行的语言 。JavaScript有个东西叫变量提升(hoisting),它会将当前作用域的所有变量的声明提升到程序的顶部。
    1
    2
    3
    4
    num = 1;

    console.log(num);
    var num;
    等价于
    1
    2
    3
    4
    var num;
    num = 1;

    console.log(num);

那我们再来看一个例子:

1
2
console.log(num);  // undefined
var num = 1;

那为什么这里会打印 undefined 呢?原因为 JavaScript会将变量的声明提升到顶部,可是赋值语句并不会提升。
所以上面demo()函数的声明,变量demo会被提升到顶部,但是变量的值并没有提升,所以变量式声明函数时,函数的调用应该在该表达式的后面:

1
2
3
4
var demo = function () {
console.log('this is a function.')
}
demo(); // this is a function.

我们再来说一个题外话:

1
2
3
4
5
fun();
function fun(){
console.log('this is a function.');
}
var fun = 2;

你觉得上面会报fun is not a function吗?不,其实它会输出 this is a function. 当函数声明与其他声明一起出现的时候,是以谁为准呢?答案就是,函数声明高于一切

构造器式

1
2
let constructor = new Function('name','age',"console.log(name + '的年龄为' + age);")
constructor('张三',18); // 张三的年龄为18

函数的返回值

当 JavaScript 到达 return 语句,函数将停止执行。
如果函数被某条语句调用,JavaScript 将在调用语句之后“返回”执行代码。

在JavaScript中不管我们指没指定函数的返回值,函数都会返回一个值
指定返回值 -> 返回指定的值
未指定返回值 -> 返回undefined

我们来用代码来展示效果:

1
2
3
4
5
6
7
8
9
10
var fun1 = function () {
return '返回一个字符串';
}

var fun2 = function () {

}

console.log(fun1()); // 打印:返回一个字符串
console.log(fun2()); // undefined

为何使用函数?

您能够对代码进行复用:只要定义一次代码,就可以多次使用它。
您能够多次向同一函数传递不同的参数,以产生不同的结果。