JavaScript - 为什么在函数表达式“未定义”中创建此函数声明?

IT技术 javascript
2021-03-18 15:14:47

我只是想弄清楚这个函数表达式。

似乎如果我创建一个p似乎包含函数声明的函数表达式 ( ),函数声明a()将返回 undefined。

var p;
p = function a() { return 'Hello' }

typeof p; // returns 'function'
typeof a; // returns 'undefined'

谁能解释为什么会这样?

如果我的术语也关闭了,也请告诉我。

3个回答

它不是函数声明。它是一个恰好有名称的函数表达式。名称不会创建变量,但您可以在对象上看到它

quentin@raston ~ $ node
> var p;
undefined
> p = function a() { return 'Hello' }
[Function: a]
> typeof p; // returns 'function'
'function'
> typeof a; // returns 'undefined'
'undefined'
> p
[Function: a]
> p.name
'a'
>
另外值得注意的是,name函数实例属性是非标准的。
2021-05-09 15:14:47
值得注意的是:函数名也可以作为函数体内的标识符使用,因此可以递归调用命名函数表达式。
2021-05-15 15:14:47

似乎如果我创建一个似乎包含函数声明的函数表达式 (p)

不是。它是一个命名的函数表达式,它不“包含”一个函数声明函数表达式的名称可用作函数作用域内的标识符(指向函数本身)和非标准name属性

(不敢相信没有人提供到 kangax 网站的链接)
2021-05-20 15:14:47

您可以将其视为匿名函数。

这是有效的原因是因为局部函数名称a可以在函数声明中用于递归,但在此范围之外无效。

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/function

抱歉,我的术语可能有问题 - 我的目标是了解问题的要点。你会如何描述它?
2021-05-13 15:14:47
“您创建了一个匿名函数声明。” 不,他/她没有。首先,它不是匿名的。其次,它不是声明。它是一个命名函数表达式(函数声明和函数表达式是不同的东西;JavaScript 两者都有。如果它被用作右边的值,你就知道它是一个表达式。)你是非常正确的,thea在函数的范围内,但不在它的范围内,不过. (不是我的反对票,顺便说一句。)
2021-05-18 15:14:47