函数表达式
**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 表格仅在浏览器中加载