企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## JS预编译 > JS执行前会进行预编译 - 全局预编译GO(Global Object) - 函数预编译AO (Activation Object) ``` var a function fun() { } function abc() { } function a() { } console.log(a); var a = 100; console.log(a); ``` - 会生成一个对象(GO),这个对象封装的就是作用域,称为GO(global object)。当全部挂载完成之后,然后代码在去逐行执行 ``` GO = {} ``` - 分析变量声明(var)——变量作为GO对象的属性名,值为undefined ``` GO = { a: undefined } ``` - 分析函数声明(function)——函数名作为GO对象的属性名,值为函数体(如果遇到同名,直接覆盖) ``` GO = { a: undefined, fun: function fun(){}, abc: function abc(){} } ``` - 当走到某一行的时候;a产生了一次赋值;此时GO对象变成了: ``` GO = { a: 100, fun: function fun(){} abc: function abc(){} } ``` - 逐行执行(看着GO对象里面的执行) ***** > **AO:是函数执行前的一瞬间,生成一个AO对象(在函数执行前的一瞬间会生成自己的AO,如果函数执行2次,生成了两次AO,这两次的AO是没有任何关联)** ``` var num = 100 function fun(num, age) { console.info(age) var age = 15 console.info(age) console.log(num) function ohter() {} } fun(5, 12) ``` - 执行前的一瞬间,会生成一个AO(action object)对象 ``` AO = {} ``` - 将函数内的形参和变量声明存储到AO对象中,值为undefined ``` AO = { num: undefined, age: undefined } ``` - 将实参和形参统一,形参作为AO对象的属性名,实参作为AO对象的属性值 ``` AO = { num: 100, age: 12 } ``` - 分析函数声明,函数名作为AO对象的属性名,值为函数体,如果遇到同名的,直接覆盖 ``` AO = { num: 100, age: 12, ohter: function() {} } ``` - 整体执行过程 ``` // step - 1 GO = {} // step - 2 GO = { num: undefined } // step - 3 GO = { num: undefined, fun: function((num, age) { console.info(age) var age = 12 console.log(num) function ohter() {} } } // 逐行执行(赋值) step - 4 GO = { num: 100, fun: function((num, age) { console.info(age) var age = 12 console.log(num) function ohter() {} } } // 执行函数 step - 5 AO = {} // step - 6 AO = { num: undefined, age: undefined } // step - 7 AO = { num: 100, age: 12 } // step - 8 AO = { num: 100, age: 12, ohter: function() {} } // 执行console.info(age) step - 9 12 // 执行赋值 step - 10 AO = { num: 100, age: 15, ohter: function() {} } // 执行console.info(age) step - 11 15 // 执行console.info(num) step - 12 5 ```