非常教程

JavaScript参考手册

Operators

function

function 关键字可以用来在一个表达式中定义一个函数。

你也可以使用 Function 构造函数和一个函数声明来定义函数。

语法

var myFunction = function [name]([param1[, param2[, ..., paramN]]]) {
   statements
};

从ES2015开始,你也可以使用箭头函数。

参数

name函数名称。可被忽略,此种情况下的函数是匿名函数(anonymous)。 函数名称只是函数体中的一个本地变量。

paramN被传递给函数的一个参数名称。一个函数至多拥有 255 个参数。

statements构成函数体的语句。

描述

函数表达式(function expression)非常类似于函数声明(function statement)(详情查看函数声明),并且拥有几乎相同的语法。函数表达式与函数声明的最主要区别是函数名称(function name),在函数表达式中可忽略它,从而创建匿名函数(anonymousfunctions)。一个函数表达式可以被用作一个IIFE(即时调用的函数表达式),它一旦定义就运行。更多信息请查看函数。

 函数表达式提升 (Function expression hoisting)

JavaScript中的函数表达式没有提升,不像函数声明,你在定义函数表达式之前不能使用函数表达式:

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

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

命名函数表达式(Named function expression)

如果你想在函数体内部引用当前函数,则需要创建一个命名函数表达式。然后函数名称将会(且只会)作为函数体(作用域内)的本地变量。这样也可以避免使用非标准的 arguments.callee 属性。

var math = {
  'factorial': function factorial(n) {
    if (n <= 1)
      return 1;
    return n * factorial(n - 1);
  }
};

被函数表达式赋值的那个变量会有一个name属性,如果你把这个变量赋值给另一个变量的话,这个name属性的值也不会改变。如果函数是一个匿名函数,那name属性的值就是被赋值的变量的名称(隐藏值)。如果函数不是匿名的话,那name属性的是就是这个函数的名称(显性值)。这对于箭头函数也同样适用(箭头函数没有名字,所以你只能赋予name属性一个隐性名)。

var foo = function() {}
foo.name // "foo"

var foo2 = foo
foo2.name // "foo"

var bar = function baz() {}
bar.name // "baz"

示例

下面的例子定义了一个匿名函数并把它赋值给变量x。这个函数返回它参数的平方:

var x = function(y) {
   return y * y;
};

更多情况下被当作回调函数使用:

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

规范

Specification

Status

Comment

ECMAScript Latest Draft (ECMA-262)The definition of 'Function definitions' in that specification.

Living Standard

ECMAScript 2015 (6th Edition, ECMA-262)The definition of 'Function definitions' in that specification.

Standard

ECMAScript 5.1 (ECMA-262)The definition of 'Function definition' in that specification.

Standard

ECMAScript 3rd Edition (ECMA-262)The definition of 'Function definition' in that specification.

Standard

Initial definition. Implemented in JavaScript 1.5.

浏览器兼容性

Feature

Chrome

Edge

Firefox (Gecko)

Internet Explorer

Opera

Safari

Basic support

(Yes)

(Yes)

(Yes)

(Yes)

(Yes)

(Yes)

Trailing comma in parameters

?

?

52.0 (52.0)

?

?

?

Feature

Android

Chrome for Android

Edge

Firefox Mobile (Gecko)

IE Mobile

Opera Mobile

Safari Mobile

Basic support

(Yes)

(Yes)

(Yes)

(Yes)

(Yes)

(Yes)

(Yes)

Trailing comma in parameters

?

?

?

52.0 (52.0)

?

?

?

?

JavaScript

JavaScript 是一种高级编程语言,通过解释执行,是一门动态类型,面向对象(基于原型)的解释型语言。它已经由ECMA(欧洲电脑制造商协会)通过 ECMAScript 实现语言的标准化。它被世界上的绝大多数网站所使用,也被世界主流浏览器( Chrome、IE、FireFox、Safari、Opera )支持。JavaScript 是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持 I/O,比如网络