词法分析 分析什么?
按顺序3样东西
1.先分析参数
2.再分析变量声明
3.分析函数声明
一个函数能使用的局部变量,就从上面的3步分析而来
具体步骤:
1.在函数运行的前的瞬间,会生成Active Object(活动对象)
2.再把声明的参数(形参) 形成AO的属性 值全是undefined
如果有实参:则接收形成相应参数的值
3.再分析变量声明! 如var age(如果没有变量声明则跳过该步骤)
如果AO上已经有age属性,则不做任何影响
如果AO上还没有age属性,则添加AO属性,值为undefined
4.分析函数声明,如function foo(){}
把函数赋给AO.fool属性
注意: 如果此前fool属性已经存在,则会被无情地覆盖
function t(age) {
alert(age);
}
t(5); //5
t(); //undefined
上例词法分析过程:
AO{age:undefined}
运行过程:
t(5); AO.age=5 alert(AO.age) 得到5
t(); 没有得到赋值 AO.age=undefined 还是undefined
function t2(age) {
var age=99;
alert(age);
}
t2(5);
以上分析过程:
0.形成AO一个空对象 AO={}
1.分析形参 AO={age:undefined} 分析实参 AO={age:5}
2.分析变量var age 发现AO已经有age属性 因此不做任何影响
执行过程:
AO.age=99;
alert(age) 得到99
function t3(greet) {
var greet="hello";
alert(greet);
function greet() {
}
alert(greet);
}
t3(null);
词法分析过程:
0: AO={};
1.分析形参 AO={greet:undefined} 分析实参 AO={greet:null}
2.分析变量声明 var greet AO已经有greet属性,因此不做任何影响
3.分析greet函数声明 AO.greet=function() 即greet属性值被覆盖成函数
执行过程:
greet='hello'; 赋值
alert(greet); //hello
alert(greet); //hello
function t4(greet) {
var greet;
alert(greet);
function greet() {
}
alert(greet);
}
t4(null);
词法分析过程:
0: AO={};
1.分析形参 AO={greet:undefined} 分析实参 AO={greet:null}
2.分析变量声明 var greet AO已经有greet属性,因此不做任何影响
3.分析greet函数声明 AO.greet=function() 即greet属性值被覆盖成函数
执行过程:
alert(greet); //function greet(){}
alert(greet); //function greet(){}
function a(b) {
alert(b);
b = function (){
alert(b);
}
b();
}
a(1);
词法分析 分析什么?
按顺序3样东西
1.先分析参数
2.再分析变量声明
3.分析函数声明
一个函数能使用的局部变量,就从上面的3步分析而来
具体步骤:
1.在函数运行的前的瞬间,会生成Active Object(活动对象)
2.再把声明的参数(形参) 形成AO的属性 值全是undefined
如果有实参:则接收形成相应参数的值
3.再分析变量声明! 如var age(如果没有变量声明则跳过该步骤)
如果AO上已经有age属性,则不做任何影响
如果AO上还没有age属性,则添加AO属性,值为undefined
4.分析函数声明,如function foo(){}
把函数赋给AO.fool属性
注意: 如果此前fool属性已经存在,则会被无情地覆盖
分析过程:
0:生成一个活动对象AO={}
1:分析形参声明 AO={b:undefined} 分析实参 AO={b:1}
2:分析变量var声明 没有 跳过该步骤
3:分析函数声明 (重难点)此处有没有声明函数?
b=function(){} 是一个赋值过程, 是一个函数表达式的返回值 赋值给b变量
执行过程:
alert(b); // 1
b=function(){
alert(b);
}
b();// function(){alert(b)}