Grouping operator(括号操作符)中函数转换引发的一次讨论。
起因是群里有朋友提出了这么一个问题:
于是大家展开了讨论。看到这个题目我觉得很有意思,也许你会想到《你不知道的javascript》中那个经典的例子。查阅一些资料后(这一次查阅主要是找到了这篇文章:函数表达式与函数声明,这篇文章中也给出了那个经典例子的解答。)。
我将找到的文章中与这题最紧密相关的一段话截图发在了群中:
出现了下面的讨论:
到这里,出来了问题的关键点,之前的重心放在为什么这个声明在外部(无论之前还是之后)都引用不到,通过资料发现是因为把它解析成了一个匿名函数表达式。但是上面这位朋友提出的这个问题(既然是匿名的,为什么在函数内部可以拿到foo这个引用),引发了我进一步的思考。然后跑步去了- -,回来后继续查阅,如下:
这里图太小,补充说明下,我发的图片是这张:(出自ES5的规范: 函数表达式规范)
我认为规范已经说的很明白了,即“在函数表达式中的函数名只能被函数内部引用到,出了内部这个作用域,其他任何地方都无法直接引用。”, 我认为规范与我的猜测(即下图)
(PS:我这里说的匿名函数就是当前匿名函数的意思))
是一致的。我认为这两者基本等价。
But, 那位朋友说:
PS:图太小了,他发的图片是这张:
上图和下图都包含了我的回复
PS: 这里我说的在内部定义,我想表达的意思准确来说是在内部的第一行定义,类似于JAVA在构造函数中调用父类构造函数只能在第一行,我的意思就是这种现象等价于他隐式在第一行定义了foo为当前匿名函数。
但是这位朋友非要说这有本质的区别(见下图),我实在是没办法继续说下去了。。(PS:无关内容(关于其他问题的讨论)被我马赛克掉了)
所以最后,希望大家发表自己的看法,无论有何种观点,都欢迎和大家讨论~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。