每个函数都是Function类型的实例,而Function也有属性和方法。
    因为函数是对象,所以函数名就是指向函数对象的指针,而且不一定与函数本身紧密绑定。
    函数的定义方式:
    ① 通常以函数声明的方式定义:

    1. function sum(num1, num2) {
    2. return num1 + num2;
    3. }

    注: 函数定义最后没有分号
    ② 另一种定义函数的语法是函数表达式。
    函数表达式与函数声明几乎是等价的:

    1. let sum = function(num1, num2) {
    2. return num1 + num2;
    3. }

    代码定义了一个变量sum并将其初始化为一个函数。这个函数可以通过变量sum来引用。
    注:这里的函数末尾有分号,与任何变量初始化语句一样。
    ③ 定义函数的方式与函数表达式很像,叫作“箭头函数”(arrow function)

    1. let sum = (num1, num2) => {
    2. return num1 + num2;
    3. };

    ④ 最后一种定义函数的方式是使用Function构造函数(不推荐)

    1. let sum = new Function('num1', 'num2', 'return num1 + num2');

    不推荐用这种语法来定义函数,原因:
    这段代码会被解释两次:第一次是将它当作常规ECMAScript代码,第二次是解释传给构造函数的字符串。影响性能。
    优点:把函数想象为对象,把函数名想象为指针是很重要的。而上面这种语法很好地诠释了这些概念。

    注:这几种实例化函数对象的方式之间存在微妙但重要的差别,但通过其中任何一种方式都可以创建函数。