// 引例
<script type="text/javascript">
function a(b) {
alert(b);
function b() {
alert(b);
}
b();
}
a(1);
/*
function b() {
alert(b);
}
function b() {
alert(b);
}
*/
</script>
/*
分析期:
0: AO = {}
1:
1.1 分析参数 AO= {b:undefined>
1.2 接收参数 AO= {b:1}
2: 分析var 声明,此函数没有var
3: 分析函数声明,AO = {b: function(){alert(b);}
执行期:
alert(b); // function
b(); // 由作用域寻找到a函数中的b,即function,alert() 出来
*/
/*
语法分析,分析3样东西
第1步: 先分析参数
第2步: 再分析变量声明
第3步: 分析函数声明
一个函数能使用的局部变量,就从上面的3步分析而来
具体步骤:
0:函数运行前的1瞬间,生成Active 0bject (活动对象),下称AO
1: 把声明的参数,形成AO的属性,参数的值即属性的值
2:分析变量声明声明声明! 如 var age,
如果AO上还没有age属性,则添加AO属性,值是undefined
如果AO上已经有age属性,则不做任何景响
3: 分析函数声明,如function foo() {),则把函数赋合A0.foo属性
注:如果此前foo属性已存在,则被无情覆盖
*/
function t2(age) {
alert(age);
}
t2(5); // 5
t2(); //undefined
/*
分析过程:
0:形成AO = {}
1:
1.1 分析形参 AO = {age:undefined}
1.2 接收形参 AO = {age:5}
2:分析var age,发现AO已有age属性,不做任何影响
执行过程:
AO.age = 99;
alert(age);
*/
<script type="text/javascript">
function t3(great) {
var greet = 'hello';
alert(greet);
function greet() {
}
alert(greet);
}
t3(null); // hello hello 两个函数
</script>
/*
词法分析过程:
0: AO = {}
1:
1.1 分析形参 AO = {greet:undefined}
1.2 接收形参 AO = {greet:null}
2: 分析greet变量声明,AO已经有greet属性,因此不做任何影响
3:分析greet函数声明,AO.greet= function() {},被覆盖成函数
执行过程:
greet = ‘he11o’;
alert(greet);
alert(greet);
*/