函数 | 函数声明与函数表达式

函数定义

函数通常可以以(1)函数声明;(2)函数表达式 ;(3)Function构造函数【不推荐】 三种方式进行定义。

函数声明

(一般来说,函数声明最后没有分号,因为在代码块的结尾不需要加分号)

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

函数表达式

(函数表达式实际上是赋值的形式,建议加上分号)

函数表达式就像一个普通的变量定义和赋值,即创建一个函数再把它赋值给一个变量functionName,这样创建的函数叫做匿名函数(未赋值给其他变量的匿名函数的name属性是空字符串)

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

函数表达式有几种不同的形式:

  • 形式一(最常见):

    1
    2
    3
    let functionName = function(...args) {
    // 函数体
    };
  • 形式二:一个函数把另一个函数当作值返回

    1
    2
    3
    4
    5
    6
    7
    8
    function createComparisonFunction(propertyName) {
    return function(object1, object2) {
    let value1 = object1[propertyName];
    let value2 = object2[propertyName];

    return value1 + value2;
    };
    }

    createComparisonFunction()函数返回一个匿名函数,这个匿名函数可以被赋值给一个变量或者直接调用,任何时候,只要函数被当作值来使用,它就是一个函数表达式

函数声明 和 函数表达式的区别

两者最主要的区别是:函数声明提前

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// eg1:函数声明提前
console.log(sum(10, 10)); // 20
function sum(num1, num2) {
reutrn num1 + num2;
}


//eg2:函数表达式不提前
console.log(sum(10, 10)); // Uncaught ReferenceError: sum is not defined
let sum = function(num1, num2) {
return num1 + num2;
};

// 注意:这个报错并不是let引起的,将let改为var也会报错,即使var也会声明提前,但console.log的时候,sum为undefined,所以会引起报错:Uncaught TypeError: sum is not a function

红宝书解释如下: JavaScript引擎在任何代码执行之前,会先读取函数声明,并在执行器上下文中生成函数定义,而函数表达式必须等到代码执行到它那一行,才会在执行上下文中生成函数定义。

面试题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// eg1
console.log(sum(10)); // 打印结果为13,函数声明提前+函数覆盖

var sum = function(num) {
return num+1;
};

function sum(num) {
return num+2;
}

function sum(num) {
return num+3;
};