super-fool / blog

珍藏经典, 分享思想, 共同进步.加油
3 stars 0 forks source link

JS编译器理论 #75

Open super-fool opened 3 years ago

super-fool commented 3 years ago

JS 是一个动态解释型语言.

边编译边执行

解释型(JIT): 无需提前编译好 , 而是由解释器实时运行编译的.

for(i=0; i < 1000; i++){
    sum += i;
}

在编译型语言中, 上述代码会解析1000次生成机器语言, 但是, 解释型语言只会解析一遍并保存一个编译版本, 等到下次再执行时会通过版本号再次执行(V8牛逼!)

V8进行编译此段代码,编译大致经过三个步骤:

来分析以下代码:

var globalStr = 'hello';
function test() {
   var funcStr = 'hi';
   console.log(globalStr)
}
test();
console.log('end');

JS引擎(V8)最开始的编译则是全局代码的编译; 编译时会生成一个全局上下文push到执行栈中并发现globalStr, test两个变量,然后在栈中保存变量(仅仅保存变量)
编译后开始执行代码, 发现了test(), 编译器会从栈中获取test变量并进行赋值, 然后生成一个函数上下文push到执行栈中, 发现funcStr变量保存到占中, console.log(globalStr) 会根据执行栈中查询该变量, 执行完该函数后pop出栈, 继续执行全局上下文代码console.log('end');

参考:https://segmentfault.com/a/1190000013126460

super-fool commented 3 years ago

作用域规则集合: