JavaScript词法分析
程序的运行分为编译和执行两个步骤,JavaScript属于编译型语言就是先将代码编译一遍再执行,在编译阶段就涉及到词法分析。以函数为例分析,一个函数在编译时首先在作用域链中会产生一个全局对象,该全局对象中包括所有全局变量,比如this,window,document,函数本身的名字等,然后编译到函数调用部分会产生一个活动对象,该对象中包括所有所有局部变量、命名参数(形参)、参数集合(arguments)以及this,当执行阶段函数调用结束该活动对象也会被销毁。下面以一个具体函数分析一下编译的过程
function bar(age) { console.log(age); var age = 99; var sex="male"; console.log(age); function age(){ alert(123); } ; console.log(age); return 100; } result=bar(5);
上面的函数的编译过程是这样的,首先形参age会生成一个活动对象的参数AO.age,因为没有赋值传值操作所以AO.age=undefined,然后函数被调用传入参数5,这时AO.age=5,函数内部定义了局部变量age,发现有多动对象的参数
AO.age所以不做处理否则age=undefined,函数还定义了局部变量sex,此时AO.sex=undefined,最后发现内部定义了函数age,此时AO.age=function age () {...},编译阶段结束。开始执行函数,输出age因为此时AO.age=function age () {}
所以输出的是函数,然后AO.age被赋值为99且之后没有赋值操作了所以后面的两个都是输出99,然后AO.sex被赋值为male,最后把100返回出去。
总体来说,程序的编译阶段就是在内存中准备好需要的变量,执行阶段就是给这些变量赋值以及其他操作。

浙公网安备 33010602011771号