javascript词法分析自己的个人理解。

例子一:


var d = "b";
function a(b){ 
    function b(b){
        alert(b);
    }
    alert(b);
    b(d);
}
a(1);


//最大外层分析阶段
oa.d = function a(b);
//执行的时候 oa.d = "b";


当执行到a(1)时;


分析a(1)层
没有var声明变量
oa.b = undif
oa.b = funtion a(b);


//执行阶段
//函数体里面的所有变量都是先在所属层级oa里面先查找有没有对应的属性,如果有则就是这个属性值,如果没有
  则继续向外层oa上寻找知道找到位置,这就是函数作用于的原理。直到找到最顶级oa。如果依然没有找到就报错。
弹出oa.b的funtion  
执行到b(a)时进入
    里层分析阶段
        里层的oa
        l_oa.b = undif
        l_oa.b = d变量,a变量在当前oa属性里面找不到,继续向外层oa上寻找,在最外层oa上找到oa.d = "b";
        所以l_oa.b = 最外层oa.d = "b";
        没有var 声明,也没有funtion声明
    执行alert(b),先查看里层oa,l_oa上有没有b属性,找到l_oa.b = 嘴外层oa.d = "b"所以就输 l_oa.b = "b"; 
    








例子二:


var b = "b";
function a(b){ 
    function b(){
        alert(b);
    }
    alert(b);
    b();
}
a(1);


//外层分析阶段
oa.b = undif
oa.b = 1
没有var声明变量
oa.b = funtion;


//执行阶段
//函数体里面的所有变量都是先在所属层级oa里面先查找有没有对应的属性,如果有则就是这个属性值,如果没有
  则继续向外层oa上寻找知道找到位置,这就是函数作用于的原理。直到找到最顶级oa。如果依然没有找到就报错。
弹出oa.b的funtion  
执行到b(b)时进入
    里层分析阶段
        里层的oa
        l_oa.b = undif
        l_oa.b = 外层oa.b
    执行alert(b),先查看里层oa,l_oa上有没有b属性,没有查找到l_oa.b ,继续向外层查找外层oa.b,找到外层oa.b属性
    所有就输出外层oa.b 的funtion; 








例子三:


var b = "b";
function a(b){ 
    function b(b){
        alert(b);
    }
    alert(b);
    b(b);
}
a(1);


//外层分析阶段
oa.b = undif
oa.b = 1
没有var声明变量
oa.b = funtion;


//执行阶段
//函数体里面的所有变量都是先在所属层级oa里面先查找有没有对应的属性,如果有则就是这个属性值,如果没有
  则继续向外层oa上寻找知道找到位置,这就是函数作用于的原理。直到找到最顶级oa。如果依然没有找到就报错。
弹出oa.b的funtion
执行到b(b)时进入
    里层分析阶段
        里层的oa
        l_oa.b = undif
        l_oa.b = 外层oa.b
    执行alert(b),先查看里层oa,l_oa上有没有b属性,查找到l_oa.b属性且 = 外层oa.b
    所有就输出外层oa.b 的funtion; 

你可能感兴趣的:(web前端)