关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

js作用域与词法分析

发布时间:2020-02-05 18:43:56

js作用域与词法:

作用域由里向外

最内层的函数可以访问外层函数的东西(如变量、函数等)

function t1(){

          var str1="aaaa";

  function t2(){

var  str2="bbbb";

console.log(str1);  //访问t1中的str1

  }

    t2();

           console.log(str2); //t1中访问t2中的str2  

}

t1();

执行结果:aaaa   uncaught ReferenceError: Console is not defined

词法分析

主要分析三样东西,这里说的是函数

A.参数

B.变量声明

C.函数声明

在函数执行前函数会先做词法分析:

一、生成一个Active Object对象(活动对象),检查AO对象

二、形参会形参AO的属性,值全部等于undefined,接下来接收实参,此时属性的值是接收的实参

三、函数内变量的声明(是声明而不是赋值,如var a=5而不是a=5)也形成AO的属性

四、分析函数的声明,形成AO的属性(如 function t(){},就会形成AO.t)

例子1:

function t(x){

   console.log(x);

}

t(2);

t();

执行结果:2  undefined

经过词法分析可得到函数参数X=undefined

运行t(2) 2替换了 undefined   而t()没有传值,因此X还是等于undefined

 

例子2:

function t(fun){

   var fun;

   console.log(fun);

   function fun(){    

   }

   console.log(fun);

}

t(null);

分析过程

生成AO对象

AO.fun=undefined

声明变量fun

声明函数,形成AO.fun=function(){},到此原来的undefined被覆盖   

分析完后执行:两个console.log(fun),因此结果是打印:function fun()   function fun()

 

例子3:

function t(fun){

   var fun=”aaaa”;

   console.log(fun);

   function fun(){  

   }

   console.log(fun);

}

t(null);

分析过程

生成AO对象

AO.fun=undefined

声明变量fun  (注意这里的赋值过程不再词法分析的范围内)

声明函数,形成AO.fun=function(){},到此原来的undefined被覆盖   

分析完后执行:赋值 和console.log(fun),因此结果是打印:aaaa   aaaa



/template/Home/Zkeys/PC/Static