开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情
引擎
引擎的作用是从头到尾负责整个JavaScript程序的编译和执行过程。
编译器
编译器是负责词法分析、语法分析和代码生成等编译工作,干的都是脏活累活。
LHS和RHS
L和R这个你一定能猜出来,L就是Left,R就是Right,左侧和右侧。LHS全称是Left Hand Side。当变量出现在赋值操作符的左侧时,就是LHS查询,出现在右侧时是RHS查询。这么说其实不太准确,例如:
console.log(a) // RHS查询
输入a的值,其实也不存在操作符,这里是需要在作用域查找到变量a的值,属于RHS查询。那RHS是不是可以理解为非左侧查询。
作用域
负责收集并维护所有声明的标识符组成的一系列查询,并根据严格的规则来确定标识符的访问权限。
对话
function foo (a) {
console.log(a)
}
foo(100)
根据以上一段简单的代码,我们来通过对话的方式来模拟下引擎、编译器和作用域三者是如何配合完成工作的。
引擎:作用域,我需要对foo进行RHS查询,请帮忙看看是否存在foo?
作用域:有的,刚编译器正好在忙活呢,现在已经完成了,给你...
引擎:那我现在就来执行下foo
引擎:哦,对了,我需要对a进行LHS查询,你有见过吗?
作用域:见过,最近有对它作为foo的形参
引擎:太好了!我继续
引擎:作用域,我还需要对console进行RHS查询,您再帮我看看?
作用域:没问题,它是全局的内置对象,拿去直接用
引擎:太棒了!它的log函数正好是我需要的,只是log函数内有a变量,我需要对它进行RHS查询
作用域:这个有的,编译器早就声明好了,而且你刚才在执行foo的时候,也已经给他进行了LHS查询,可以直接输出值了
引擎:完美,这一切太顺利了,作用域,还有编译器,非常感谢你们的协助。
作用域:不用客气,为了把事情做好,这都是我们应该做的。
以上对话,大体反映了这段代码的执行过程。当然,其中还有很多细节,需要我们再深入探究和理解。