JS 何时解析function

我们都知道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这句代码的时候?


阿波罗的战车
浏览 479回答 1
1回答

犯罪嫌疑人X

闭包是词法域,和你的问题无关。JS的函数分为function declaration和function expression,你写的例子里,外面的是declaration,里面的是expression。对于declaration,是在它的function scope(包括global)开始执行之前解析的,类似变量的hoist,对于expression,是执行到表达式估值的时候解析的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript