
b
是匿名函数?
IsAnonymousFunctionDefinition()
用来判断一个函数是否为匿名函数,但是这个函数只在规范中使用,通过 JS 代码并不能调用,很多 JS 引擎会在内部实现这个函数(非强制要求)。
-
函数没有名字 -
函数的 name
属性是"anonymous"
name
是继承自
Function.prototype.name
,因此没有名字的函数的
name
属性是空字符
""
。
<anonymous>
,也就是我们经常说的匿名函数。
var a = () => () => { throw new Error('foo') }
a()()
,还是
var b = a(); b()
,在 Chrome 中执行:Global Scope
)
b
函数,
a
都不应该出现在调用栈中,我觉得这应该可以算是 FireFox 的一个 bug 了。
new Function
定义函数,错误栈里是没有尖括号的。因为根据规范,使用
Function
定义的函数是有名字的,名字就是
"anonymous"
。就好比一个人叫无名氏,并不是因为他没有名字,而是他姓无,叫名氏。
var a = new Function('throw new Error("bar")')
a()
var a = () => () => 1
的函数名是
a
,而
var b = a()
就是匿名函数。
var a = () => 1
包含了 2 个阶段,箭头函数定义和赋值操作。所有的箭头函数都是匿名函数,在箭头函数的定义中,规范内部的
hasName
属性直接设置为了
false
。然后
IsAnonymousFunctionDefinition(expr)
判定此函数是匿名函数:
-
If IsFunctionDefinition
ofexpr
isfalse
, returnfalse
. -
Let hasName
be HasName of expr. -
If hasName
istrue
, returnfalse
. -
Return true
.
var b = a()
。这个也包含了赋值操作,还有一个函数调用操作。
var a = (1, () => 'foo')
a = [() => 1][0]
var a = eval('()=>1')
本文分享自微信公众号 - justjavac(justjavac-blog)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。