词法分析的过程:
- 先分析参数
- 分析变量声明
- 分析函数声明
具体步骤:
- 在函数运行前的一瞬间,先生成Active Object活动对象;
- 函数声明的参数,形成AO的属性,值为undefined
- 接收参数(实参),形成AO相应属性的值
- 分析变量的声明,如 var age,
c-1. 如果AO还没有age属性,则添加AO的age属性,值是undefined
c-2. 如果AO已经有了age属性,则不作任何影响
5. 分析函数声明,如function foo(){},则吧函数付给AO.foo属性,如果此前foo属性已存在,则被无情的覆盖了。
举例:
function t(greet){ var greet = 'hello'; alert(greet); function greet(){} alert(greet); } t(3);
解析:
一. 词法分析过程
- 生成AO={};
- 分析函数的参数greet, AO={greet:undefinde}
- 接收实参,AO = {greet:3}
- 有变量声明,但是由于AO已经有了greet属性,所以不受任何影响,AO = {greet : 3}(注意:声明仅仅是 var greet,而greet = ‘hello’是赋值,在执行阶段被执行。)
- 有函数声明,生成AO.greet = function(){};
二. 语句执行过程
- 执行greet = 'hello';
- Alert(greet);
- Alert(greet);
所以本题弹出两个hello.
思考题:
function a(b){ Var b; alert(b); function b(){ alert(b); } b(); } a(1);
解析:
一、词法分析过程
- 生成AO={}
- 分析参数b,AO={b:undefined}
- 接收实参,AO = {b:1}
- 分析变量声明,而由于AO已经有了greet属性,所以不做影响。AO = {b:1}
- 分析函数声明,AO= {b:function(){aler(b)}}
二、函数执行过程
- 执行alert(b);
- 执行b();也是alert(b);
这种所以本题应该alert两次function(){alert(b)}

浙公网安备 33010602011771号