函数值到底是什么?

What precisely is a function value?

在 JavaScript (ECMAScript 5) 中,函数是有值的(它们被告知是 "first-class functions")。

这允许我们将它们用作表达式(表达式是产生值的所有内容,并且可以包含其他表达式:var exp0 = (exp1) + exp2 - exp3.function(); 是语法正确的语句)。

在上面的代码中,有8个表达式:exp0, exp1, (exp1), exp2, (exp1) + exp2, exp3, exp3.function() and (exp1) + exp2 - exp3.function().


因为函数可以作为表达式,下面的代码是正确的:

var my_function_0 = function a() {} 是命名函数表达式。

下面的代码也是正确的:

var my_function_1 = function(){}` 是一个匿名函数表达式。

都值,都值


现在,考虑下面的代码:

function requiredIdentifier() {}

它不是 "named or anonymous function expression",而是一个函数声明。


我的问题是:

声明的函数have/produce是否有值?

这个问题等同于这个问题: Is a declared function an expression ?(即使它不是命名或匿名函数表达式 ?!)

好吧,如果你 运行 函数 requiredIdentifier() 的返回值是 undefined 的返回值,而 undefined 实际上是 [=15= 中的原始数据类型](ecma 脚本)。

函数声明是语句,而不是表达式。由于语句不能用在表达式中,所以问它的值是什么是没有意义的,因为没有办法使用该值。

但是,函数声明的语法与命名函数表达式的语法相同。因此,如果您在需要表达式的任何地方使用它,它将被视为命名函数表达式,并且值将是函数。

例如:

(function requiredIdentifier() {})

是一个包含命名函数表达式的括号表达式,而不是函数声明。它的值是定义的函数。

Does a declared function have/produce a value?

是的。无论使用什么语法创建函数,函数都是可调用对象(即它实现了使其可调用的内部接口):

function a() {}
var b = function() {}
var c = (new Function()) // or some other expression that returns a function

所有变量 abc 都有一个函数值。

语法之间的区别仅在于创建值时 whether/when 它绑定到变量。有关详细信息,请参阅 var functionName = function() {} vs function functionName() {}