从(function foo(){})分析JS内部究竟如何处理括号操作符

ne_smalltown

Grouping operator(括号操作符)中函数转换引发的一次讨论。

起因是群里有朋友提出了这么一个问题:

于是大家展开了讨论。看到这个题目我觉得很有意思,也许你会想到《你不知道的javascript》中那个经典的例子。查阅一些资料后(这一次查阅主要是找到了这篇文章:函数表达式与函数声明,这篇文章中也给出了那个经典例子的解答。)。

我将找到的文章中与这题最紧密相关的一段话截图发在了群中:

出现了下面的讨论:

clipboard.pngclipboard.pngclipboard.png

到这里,出来了问题的关键点,之前的重心放在为什么这个声明在外部(无论之前还是之后)都引用不到,通过资料发现是因为把它解析成了一个匿名函数表达式。但是上面这位朋友提出的这个问题(既然是匿名的,为什么在函数内部可以拿到foo这个引用),引发了我进一步的思考。然后跑步去了- -,回来后继续查阅,如下:

clipboard.png

这里图太小,补充说明下,我发的图片是这张:(出自ES5的规范: 函数表达式规范)

clipboard.png

我认为规范已经说的很明白了,即“在函数表达式中的函数名只能被函数内部引用到,出了内部这个作用域,其他任何地方都无法直接引用。”, 我认为规范与我的猜测(即下图)

clipboard.png(PS:我这里说的匿名函数就是当前匿名函数的意思))

是一致的。我认为这两者基本等价。

But, 那位朋友说:

clipboard.pngclipboard.pngclipboard.png

PS:图太小了,他发的图片是这张: clipboard.png

上图和下图都包含了我的回复clipboard.png

PS: 这里我说的在内部定义,我想表达的意思准确来说是在内部的第一行定义,类似于JAVA在构造函数中调用父类构造函数只能在第一行,我的意思就是这种现象等价于他隐式在第一行定义了foo为当前匿名函数。

但是这位朋友非要说这有本质的区别(见下图),我实在是没办法继续说下去了。。(PS:无关内容(关于其他问题的讨论)被我马赛克掉了)

clipboard.pngclipboard.png

所以最后,希望大家发表自己的看法,无论有何种观点,都欢迎和大家讨论~

阅读 1.7k

北欧小镇的前端小船
努力成为一名合格的前端工程师,无论是Javascript,还是其他,亦包括生活。

一个致力于电影,音乐,历史,自然,社会,美好事物的程序员

1.9k 声望
38 粉丝
0 条评论
你知道吗?

一个致力于电影,音乐,历史,自然,社会,美好事物的程序员

1.9k 声望
38 粉丝
文章目录
宣传栏