为了账号安全,请及时绑定邮箱和手机立即绑定

JS 何时解析function

JS 何时解析function

阿波罗的战车 2018-08-11 11:10:26
我们都知道js有一个变量提升的东西,那是因为在进入EC(执行上下文)的时候,首先会去扫当前的作用域中,有没有函数申明和变量申明,有的话,会存入AO(活动对象当中)。这个就是造成变量提升的原因。那么有一个问题,加入一个有一个函数申明在一个对象中呢(不知道这里这么叫法是否合适)?如下代码所示:function aaa() {    return {        bbb: function() {            return 1;         }     }; }console.log(aaa().bbb());如上所示,这是一个闭包,因为bbb有权访问aaa的作用域(虽然这里没有访问)。当然了,这里的关键不在于闭包。那么问题来了,我想问的是,bbb这个函数JS解析器是在什么时候解析到的呢?不可能是在进入执行上下文的时候解析吧?那是在解析return这句代码的时候,发现返回的是一个对象,然后这个对象中有一个函数?所以在创建这个函数的时候,再带上该函数的作用域链。由于这个作用域链中有aaa的作用域,所以在aaa()执行完的时候,其中的AO并没有被销毁,也就是形成了闭包。不知道上面这么理解有没有误?疑惑在于bbb中的function是在什么时候被JS引擎解析的?是在一开始创建执行上下文?还是在执行到return这句代码的时候?
查看完整描述

1 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

闭包是词法域,和你的问题无关。JS的函数分为function declaration和function expression,你写的例子里,外面的是declaration,里面的是expression。

对于declaration,是在它的function scope(包括global)开始执行之前解析的,类似变量的hoist,对于expression,是执行到表达式估值的时候解析的。


查看完整回答
反对 回复 2018-09-23
  • 1 回答
  • 0 关注
  • 478 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信