我们都知道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,是执行到表达式估值的时候解析的。
添加回答
举报
0/150
提交
取消