2016-03-26 32 views
0

如果我们将JavaScript引擎的操作划分为编译阶段(其中设置了整个词法范围图),Vs运行阶段(其中代码是在编译阶段使用词法范围设置来执行的),范围为函数表达式设置?它是在编译还是运行/解释阶段?函数表达式的词法范围

此外,无论何时设置函数表达式的作用域,父作用域始终是全局作用域的权利? (我看过这个代码,只是想确认一下)。

+0

我想你可能会混淆一些不同的东西。这里有两篇很好的文章可能有帮助:[Javascript Scope and Closures](https://spin.atomicobject.com/2014/10/20/javascript-scope-closures/),[Function Scope and Lexical Scoping]( http://pierrespring.com/2010/05/11/function-scope-and-lexical-scoping/)。特别注意关于“调用,绑定和应用”的部分, – paulsm4

回答

0

将范围想象为函数的层次结构更容易。如果你正在定义你的第一个函数a(),它的父范围将是全局范围。用()定义的每个函数都可以访问a()的作用域和全局作用域。在功能树上的每一个后代可以访问到它的父范围,根是在全球范围内

2

的功能(包括函数表达式)范围设置时的功能创建 - 这发生在运行阶段,而不是解析阶段。

+0

函数表达式的作用域是在运行阶段(我猜是映射到我的问题的编译阶段)设置的?如果可能的话,可否请您转发一篇提及此事的链接/文章。 –

+2

鉴于JS是一种带有优化编译器的解释型语言,“阶段”无论如何都没有太大意义。只有解析到AST,然后执行。其中包括设置功能和编译他们的身体。 – Bergi

-1

实际上发现几条链接[1][2]对此有很好的解释。看起来函数表达式的(RHS)是在运行时解释的,而函数定义是在编译时在作用域上设置的。