函数表达式

**function** 关键字可用于在表达式中定义函数。

您也可以使用 function 声明箭头语法 定义函数。

试试看

语法

js
function (param0) {
  statements
}
function (param0, param1) {
  statements
}
function (param0, param1, /* …, */ paramN) {
  statements
}

function name(param0) {
  statements
}
function name(param0, param1) {
  statements
}
function name(param0, param1, /* …, */ paramN) {
  statements
}

注意:表达式语句 不能以 function 关键字开头,以避免与 function 声明 混淆。当 function 关键字出现在不能接受语句的上下文中时,它仅在表达式中开头。

参数

name 可选

函数名称。可以省略,在这种情况下,函数是匿名的。该名称仅在函数体中是局部的。

paramN 可选

函数的形式参数的名称。有关参数的语法,请参阅 函数参考

statements 可选

构成函数体的语句。

描述

function 表达式与 function 声明 非常相似,并且具有几乎相同的语法。function 表达式与 function 声明之间的主要区别在于函数名称,它可以在 function 表达式中省略以创建匿名函数。function 表达式可以用作 IIFE(立即调用函数表达式),该表达式在定义后立即运行。有关更多信息,另请参阅有关 函数 的章节。

函数表达式提升

函数声明 不同,JavaScript 中的函数表达式不会被提升。您不能在创建函数表达式之前使用它们

js
console.log(notHoisted); // undefined
// Even though the variable name is hoisted,
// the definition isn't. so it's undefined.
notHoisted(); // TypeError: notHoisted is not a function

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

命名函数表达式

如果要引用函数体内的当前函数,则需要创建一个命名函数表达式。此名称然后仅在函数体(范围)中是局部的。这避免了使用已弃用的 arguments.callee 属性递归调用函数。

js
const math = {
  factit: function factorial(n) {
    console.log(n);
    if (n <= 1) {
      return 1;
    }
    return n * factorial(n - 1);
  },
};

math.factit(3); //3;2;1;

如果命名了函数表达式,则函数的 name 属性将设置为该名称,而不是从语法中推断出的隐式名称(例如,分配给函数的变量)。

与声明不同,函数表达式的名称是只读的。

js
function foo() {
  foo = 1;
}
foo();
console.log(foo); // 1
(function foo() {
  foo = 1; // TypeError: Assignment to constant variable.
})();

示例

使用函数表达式

以下示例定义了一个未命名的函数并将其分配给 x。该函数返回其参数的平方

js
const x = function (y) {
  return y * y;
};

使用函数作为回调

更常见的是它用作 回调

js
button.addEventListener("click", function (event) {
  console.log("button is clicked!");
});

使用立即调用函数表达式 (IIFE)

创建一个匿名函数并调用它

js
(function () {
  console.log("Code runs!");
})();

// or

!function () {
  console.log("Code runs!");
}();

规范

规范
ECMAScript 语言规范
# sec-function-definitions

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅