function
关键字可以用于在表达式内定义函数。
还可以定义函数使用
Function
构造函数和
函数声明
.
表达式不允许在语句的开头。
function [name]([param1[, param2[, ..., paramN]]]) {
statements
}
从 ES2015 起,还可以使用 箭头函数 .
name
可选
paramN
可选
要被传递给函数的自变量名称。
statements
可选
包含函数本体的语句。
函数表达式与函数声明非常相似,且句法几乎相同 (见
function
语句了解细节)。函数表达式和函数声明之间的主要差异是
函数名称
,可以在函数表达式中被省略以创建
anonymous
函数。函数表达式可以用作
IIFE (立即援引函数表达式)
,一定义就运行。另请参阅章节关于
functions
了解更多信息。
JavaScript 函数表达式不被提升,不像 函数声明 。不可以使用函数表达式在创建它们之前:
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
特性。
let 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
特性。名称不改变若把它赋值给不同变量。若省略函数名称,它将是变量名称 (隐式名称)。若存在函数名称,它将是函数名称 (显式名称)。这也适用于
箭头函数
(箭头没有名称,因此只可以给予变量隐式名称)。
var foo = function() {}
foo.name // "foo"
var foo2 = foo
foo2.name // "foo"
var bar = function baz() {}
bar.name // "baz"
console.log(foo === foo2); // true
console.log(typeof baz); // undefined
console.log(bar === baz); // false (errors because baz == undefined)
以下范例定义未命名函数并将其赋值给
x
。函数返回其自变量的平方:
var x = function(y) {
return y * y;
};
更常见的是用作 callback :
button.addEventListener('click', function(event) {
console.log('button is clicked!')
})
创建并调用匿名函数:
(function() {
console.log('Code runs!')
})();
| 规范 |
|---|
|
ECMAScript (ECMA-262)
在该规范中的 Function definitions 定义。 |
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
function
|
Chrome 1 | Edge 12 | Firefox 1 | IE 3 | Opera 3 | Safari 1 | WebView Android 1 | Chrome Android 18 | Firefox Android 4 | Opera Android 10.1 | Safari iOS 1 | Samsung Internet Android 1.0 | nodejs 0.1.100 |
| Trailing comma in parameters | Chrome 58 | Edge 79 | Firefox 52 | IE No | Opera 45 | Safari No | WebView Android 58 | Chrome Android 58 | Firefox Android 52 | Opera Android 43 | Safari iOS No | Samsung Internet Android 7.0 | nodejs 8.0.0 |
完整支持
不支持
Function
function
statement
function*
statement
function*
expression
GeneratorFunction