函数声明定义一个具有指定参数的函数。

你还可以使用 `Function` 构造函数和 一个`function expression` 定义函数。

## 语法

    function name([param,[, param,[..., param]]]) {
       [statements]
    }

`name`
  函数名

`param`
  要传递给函数的参数的名称。不同引擎中的最大参数数量不同。

`statements`
  包含函数体的语句。

## 描述

一个被函数声明创建的函数是一个 Function 对象，具有 Function 对象的所有属性、方法和行为。查看 Function 以获取 function 的详细信息。

函数也可以被表达式创建（ function expression ）

函数可以被有条件来声明，这意味着，在一个 if 语句里，函数声明是可以嵌套的。有的浏览器会将这种有条件的声明看成是无条件的声明，无论这里的条件是true还是false，浏览器都会创建函数。因此，它们不应该被使用。

默认情况下，函数是返回 undefined 的。想要返回一个其他的值，函数必须通过一个 return 语句指定返回值。

### 有条件的创建函数

函数可以被有条件来声明，这意味着，函数声明可能出现在一个 if 语句里，但是，这种声明方式在不同的浏览器里可能有不同的效果。因此，不应该在生成环境代码中使用这种声明方式，应该使用函数表达式来代替。

    var hoisted = "foo" in this;
    console.log(`'foo' name ${hoisted ? "is" : "is not"} hoisted. typeof foo is ${typeof foo}`);
    if (false) {
      function foo(){ return 1; }
    }

    // 在Chrome里:
    // 'foo' 变量名被提升，但是 typeof foo 为 undefined
    //
    // 在Firefox里:
    // 'foo' 变量名被提升. 但是 typeof foo 为 undefined
    //
    // 在Edge里:
    // 'foo' 变量名未被提升. 而且 typeof foo 为 undefined
    //
    // 在Safari里:
    // 'foo' 变量名被提升. 而且 typeof foo 为 function

注意，即使把上面代码中的 if(false) 改为 if(true)，结果也是一样的

    var hoisted = "foo" in this;
    console.log(`'foo' name ${hoisted ? "is" : "is not"} hoisted. typeof foo is ${typeof foo}`);
    if (true) {
      function foo(){ return 1; }
    }

    // 在Chrome里:
    // 'foo' 变量名被提升，但是 typeof foo 为 undefined
    //
    // 在Firefox里:
    // 'foo' 变量名被提升. 但是 typeof foo 为 undefined
    //
    // 在Edge里:
    // 'foo' 变量名未被提升. 而且 typeof foo 为 undefined
    //
    // 在Safari里:
    // 'foo' 变量名被提升. 而且 typeof foo 为 function

### 函数声明提升

JavaScript 中的函数声明被提升到了函数定义。你可以在函数声明之前使用该函数:

    hoisted(); // "foo"

    function hoisted() {
         console.log("foo");
    }

    /* equal to*/
    var hoisted;

    hoisted = function() {
      console.log("foo");
    }
    hoisted();
    // "foo"

注意 :函数表达式 `function expressions` 不会被提升:

    notHoisted(); // TypeError: notHoisted is not a function

    var notHoisted = function() {
       console.log("bar");
    };

## 示例

### 使用函数

下面的代码声明了一个函数,该函数返回了销售的总金额, 参数是产品a,b,c分别的销售的数量.

    function calc_sales(units_a, units_b, units_c) {
       return units_a*79 + units_b * 129 + units_c * 699;
    }

## 规范

Specification | Status | Comment
--- | --- | ---
ECMAScript 1st Edition. | Standard | Initial definition. Implemented in JavaScript 1.0
ECMAScript 5.1 (ECMA-262) Function definition | Standard |
ECMAScript 2015 (6th Edition, ECMA-262) Function definitions | Standard |

## 浏览器兼容性

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

- Desktop
- Mobile

Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari
--- | --- | --- | --- | --- | ---
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes)

Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile
--- | --- | --- | --- | --- | --- | ---
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes)

## 相关链接

- `Functions and function scope`
- `Function`
- `function expression`
- `function* statement`
- `function* expression`
- `GeneratorFunction`