一、编译的原理主要分为三个步骤:
1、分词/词法分析:这个步骤主要是将字符串分解成有意义的代码。
2、解析/语法分析:数组嵌套形成结构树。
3、代码生成:将结构树转化为代码的过程。
二、作用域
引擎主要进行搜索查询编译等过程,分为左查询LHS和右查询RHS;
编译器主要是进行代码的生成,语法分析。
作用域主要是 确定访问权限,收集维护所有声明的标识符。
作用域的具体体现:
2、包含foo创建的作用域,其中包含三个标识符,b ,a,bar
3、包含bar创建的作用域,只有一个标识符:C
三、欺骗词法
欺骗词法作用域会导致性能下降,典型的试eval,with
eval()可以在写的代码中用程序生成代码并运行,好像代码就写在这个位置,这就是所谓的欺骗词法。
全局eval,可以动态执行代码,申明或者改变变量,可以更改局部变量,在严格模式下,eval相当于一个运算符,可以使用别的来覆盖;
eval 只有一个参数,如果传入的不是字符串的话,它直接返回这个参数;如果是字符串,那么首先会进行编译,如编译失败则爆出语法错误;编译成功则执行代码。
with可以引用特定对象中已有的属性,不能给对象添加属性,如果给对象创建新的属性,必须明确的引用该对象。
四、作用域中let和const的区别
let将变量绑定到所在的任意作用域中(通常是{}内部);
const主要是用来创建固定值的作用域变量;
五、变量提升机制
变量的提升主要涉及到编译器的编译和执行两部分,编译器的编译部分涉及到LHS和RHS两部分。
过程就像变量和函数声明从代码出现的位置被移动到最上面,被提升的顺序是函数先被提升,然后才是变量提升。