3.7 函数

函数对任何语言来说都是核心组件,因为它们可以封装语句,然后在任何地方、任何时间执行。ECMAScript中的函数使用function关键字声明,后跟一组参数,然后是函数体。

注意 第10章会更详细地介绍函数。

以下是函数的基本语法:

    function functionName(arg0, arg1, ..., argN) {
      statements
    }

下面是一个例子:

    function sayHi(name, message) {
      console.log("Hello " + name + ", " + message);
    }

可以通过函数名来调用函数,要传给函数的参数放在括号里(如果有多个参数,则用逗号隔开)。下面是调用函数sayHi()的示例:

    sayHi("Nicholas", "how are you today? ");

调用这个函数的输出结果是"Hello Nicholas, how are you today? "。参数name和message在函数内部作为字符串被拼接在了一起,最终通过console.log输出到控制台。

ECMAScript中的函数不需要指定是否返回值。任何函数在任何时间都可以使用return语句来返回函数的值,用法是后跟要返回的值。比如:

    function sum(num1, num2) {
      return num1 + num2;
    }

函数sum()会将两个值相加并返回结果。注意,除了return语句之外没有任何特殊声明表明该函数有返回值。然后就可以这样调用它:

    const result = sum(5, 10);

要注意的是,只要碰到return语句,函数就会立即停止执行并退出。因此,return语句后面的代码不会被执行。比如:

    function sum(num1, num2) {
      return num1 + num2;
      console.log("Helloworld");  //不会执行
    }

在这个例子中,console.log不会执行,因为它在return语句后面。

一个函数里也可以有多个return语句,像这样:

    function diff(num1, num2) {
      if (num1 < num2) {
        return num2- num1;
      } else {
        return num1- num2;
      }
    }

这个diff()函数用于计算两个数值的差。如果第一个数值小于第二个,则用第二个减第一个;否则,就用第一个减第二个。代码中每个分支都有自己的return语句,返回正确的差值。

return语句也可以不带返回值。这时候,函数会立即停止执行并返回undefined。这种用法最常用于提前终止函数执行,并不是为了返回值。比如在下面的例子中,console.log不会执行:

    function sayHi(name, message) {
      return;
      console.log("Hello " + name + ", " + message); // 不会执行
    }

注意 最佳实践是函数要么返回值,要么不返回值。只在某个条件下返回值的函数会带来麻烦,尤其是调试时。

严格模式对函数也有一些限制:

❑ 函数不能以eval或arguments作为名称;

❑ 函数的参数不能叫eval或arguments;

❑ 两个命名参数不能拥有同一个名称。

如果违反上述规则,则会导致语法错误,代码也不会执行。