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);


浙公网安备 33010602011771号