资讯专栏INFORMATION COLUMN

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

chanthuang / 2960人阅读

摘要:括号操作符中函数转换引发的一次讨论。,我认为规范与我的猜测即下图我这里说的匿名函数就是当前匿名函数的意思是一致的。

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

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

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

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

出现了下面的讨论:

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

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

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

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

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

But, 那位朋友说:

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

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

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

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80534.html

相关文章

  • Functions

    摘要:如果我们把这样的定义放在全局代码中,解析器会把函数当作声明,因为它以关键字开头,在第一种情况中,我们会得到,因为我们缺少函数名。 原文 ECMA-262-3 in detail. Chapter 5. Functions. 简介 在这篇文章中,我们将讨论一个ESCMAScript对象,函数。我们将讨论不同类型的函数,每个类型是如何影响环境中的变量对象(variables object)...

    sydMobile 评论0 收藏0
  • JavaScript深入之执行上下文栈

    摘要:深入系列第三篇,讲解执行上下文栈的是如何执行的,也回答了第二篇中的略难的思考题。 JavaScript深入系列第三篇,讲解执行上下文栈的是如何执行的,也回答了第二篇中的略难的思考题。 顺序执行? 如果要问到 JavaScript 代码执行顺序的话,想必写过 JavaScript 的开发者都会有个直观的印象,那就是顺序执行,毕竟: var foo = function () { ...

    codecraft 评论0 收藏0
  • 深入解JavaScript系列2:揭秘命名函数表达式

    摘要:标识符有效性正是导致函数语句与函数表达式不同的关键所在下一小节我们将会展示命名函数表达式的具体行为。归根结底,只有给函数表达式取个名字,才是最稳妥的办法,也就是使用命名函数表达式。 前言 网上还没用发现有人对命名函数表达式进去重复深入的讨论,正因为如此,网上出现了各种各样的误解,本文将从原理和实践两个方面来探讨JavaScript关于命名函数表达式的优缺点。简单的说,命名函数表达式只有...

    chenjiang3 评论0 收藏0
  • JavaScript中的内存泄漏以及何处

    摘要:本文将会讨论中的内存泄漏以及如何处理,方便大家在使用编码时,更好的应对内存泄漏带来的问题。当内存不再需要时进行释放大部分内存泄漏问题都是在这个阶段产生的,这个阶段最难的问题就是确定何时不再需要已分配的内存。中的相同对象称为全局。 随着现在的编程语言功能越来越成熟、复杂,内存管理也容易被大家忽略。本文将会讨论JavaScript中的内存泄漏以及如何处理,方便大家在使用JavaScript...

    itvincent 评论0 收藏0
  • You Don't Know Js 阅读笔记

    摘要:回调传递函数是将函数当做值并作为参数传递给函数。这个例子中就是因为事件绑定机制中的传入了回调函数,产生了闭包,引用着所在的作用域,所以此处的数据无法从内存中释放。 javascript作用域 一门语言需要一套设计良好的规则来存储变量,并且之后可以方便的找到这些变量,这逃规则被称为作用域。 这也意味着当我们访问一个变量的时候,决定这个变量能否访问到的依据就是这个作用域。 一、词法作用域 ...

    wanglu1209 评论0 收藏0

发表评论

0条评论

chanthuang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<