1.函数运行的词法分析具体步骤如下:
先说明函数运行的瞬间,会给此函数生成一个Active Object,即AO活动对象,作用域内能找到的所有变量都在AO上。
分析
1.接收参数,以参数名为属性,参数值是属性值。
2分析var的声明,如果和参数名同名,分析时是不会影响的。
3分析函数的声明,如果和参数名同名,分析的时候同名的属性将会被覆盖
以上只是分析,具体的结果还得在执行后才得到。
2.代码加分析如下
1.
// 在这里运用词法分析法来分析和执行最终的到结果:两次输出的都是函数
// 0:得到a.AO={};
// 1.分析参数,得到a.AO={b:1},没有则略过.
// 2.分析var声明,如果和参数同名分析是不影响,.没有则略过这时:
//a.AO={b:1};
// 3.分析函数声明,如果和参数名同名则覆盖,没有则略过
// 这时a.AO={b:function(){}}
// 分析结束然后执行:
// 执行到10行 结果是a.AO={b:function(){}},所以先输出的是一个函数;
// 执行到11行的时候又用到词法分析了具体如下:
// 0.得到b.AO={};
// 1.略过
// 2.略过
// 3.略过
// 所以得到的还是一个空对象b.AO={};
// 执行到14行时,在b.AO={}上找不到b,它会跟作用域链向上找,所以找到a.AO={b:function(){}}
// 执行的结果还是一个函数.
2.
// 在这里运用词法分析法来分析和执行最终的到结果:第一次输出1,第两次输出的是函数
// 0:得到a.AO={};
// 1.分析参数,得到a.AO={b:1},没有则略过.
// 2.分析var声明,如果和参数同名分析是不影响,.没有则略过,这时:
// a.AO={b:1};
// 3.分析函数声明,如果和参数名同名则覆盖,没有则略过
// 这时a.AO={b:1};
// 分析结束然后执行:
// 执行到35行 结果是a.AO={b:1};,所以先输出的是1;
// 执行到36行的时候只进行了赋值所以b=function(){},a.AO.b=function(){}
//执行39行函数调用时先用到词法分析了具体如下:
// 0.得到b.AO={};
// 1.略过
// 2.略过
// 3.略过
// 所以得到的还是一个空对象b.AO={};
//再执行, 在b.AO={}上找不到b,它会跟作用域链向上找,所以找到a.AO.b=function(){}
// 执行的结果是一个函数.