Open super-fool opened 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');
globalStr, test
test()
test
funcStr
console.log(globalStr)
console.log('end');
参考:https://segmentfault.com/a/1190000013126460
作用域规则集合:
JS 是一个动态解释型语言.
边编译边执行
解释型(JIT): 无需提前编译好 , 而是由解释器实时运行编译的.
在编译型语言中, 上述代码会解析1000次生成机器语言, 但是, 解释型语言只会解析一遍并保存一个编译版本, 等到下次再执行时会通过版本号再次执行(V8牛逼!)
V8进行编译此段代码,编译大致经过三个步骤:
来分析以下代码:
JS引擎(V8)最开始的编译则是全局代码的编译; 编译时会生成一个全局上下文push到执行栈中并发现
globalStr, test
两个变量,然后在栈中保存变量(仅仅保存变量)编译后开始执行代码, 发现了
test()
, 编译器会从栈中获取test
变量并进行赋值, 然后生成一个函数上下文push到执行栈中, 发现funcStr
变量保存到占中,console.log(globalStr)
会根据执行栈中查询该变量, 执行完该函数后pop出栈, 继续执行全局上下文代码console.log('end');