JavaScript词法分析
在函数运行时, 会先进行词法分析(预编译) 预编译做哪些工作?
1:分析参数
2:分析变量声明
3:分析函数声明
如何分析变量声明?
答:对于var 声明的变量, 以var str = 'local'为例, 分为分析过程 和 执行过程.
先分析, 后执行.
先分析 var str; ,即仅仅声明一个str变量,str变量此时,没有赋值,值是undefined
然后再进行 执行过程.
var str = 'global'; function t() { /* alert(str); // undefined var str = 'local'; alert(str); // local */ /// 词法分析 var str; // 执行语句 alert(str); str = 'local'; alert(str;); } t();
活动对象/激活对象, Active Object
函数的变量 有其作用域,
即, 引用某变量时,在某个范围内查询该变量, 这个范围,又在哪儿?
在AO上找
在函数调用的瞬间,会产生一个AO, 这个AO对象,的属性, 即存储着该函数所能引用到的变量.
function fn1(age,hei) { var age; alert(age); // 32 alert(hei); // undefined } fn1(32);
function fn1(age,hei) { var age; alert(age); function age() { alert('hehe'); } } fn1(32); /* //词法分析过程 AO:{} AO:{age:undefined,hei:undefined} AO:{age:32,hei:undefined} AO:{age:function(){alert('hehe')},hei:undefined} // 执行: alert(age); --->AO.age--->函数 */
function t(age) { alert(age); // 99 var age = 12; alert(age); // 12 } t(99); AO:{age:undefined} // 词法分析形参得到 AO:{age:99} // 实参赋值 AO.age属性 AO:{age:12} // 修改AO.age的值
function a(b) { alert(b); // function b(){} function b(){ alert (b); // } b(); } a(1); /* //词法分析过程 a:AO:{} a:AO:{b:undefined} a:AO:{b:function} b:AO {} b:AO.b --->{}--->a:AO // 执行: alert(age); --->AO.age--->函数 */
// 函数声明 与函数表达式 // 函数表达式 function fn1(age,hei) { alert(age); var age = function () { alert('hehe'); } alert(age); } // undefined, function // function,function // 32, function (正确) fn1(32); // 函数声明 function fn1(age,hei) { alert(age); function age () { alert('hehe'); } alert(age); } // undefined, function // function,function (正确) // 32, function fn1(32);