欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js作用域和词法分析

程序员文章站 2022-04-16 15:17:24
...

JavaScript作用域:

  • 以函数作为作用域
  • 函数的作用域在函数未被调用之前,已经被创建
  • 函数的作用域存在作用域链,并且也是在被调用之前创建

示例一:

xo = 'alex';
function func() {
	var xo = 'eric';
	function inner(){
		console.log(xo);
	}
	inner();
}
	func();
				

示例二

xo = 'alex';
function func() {
	var xo = 'eric';
	function inner(){
		console.log(xo);
	}
	var xo = 'hover';
	return inner();
}
var ret = func();
ret();  //hover; 原因:函数的作用域在函数未被调用之前,已经被创建;并且值覆盖
						
func();

示例三:.函数内局部变量提前声明

function func(){
	console.log(xp);
	var xp = 'ale';
}
						
	func()//undefined,原因只声明没定义

词法分析

  1. 分析参数
  2. 再分析变量的声明
  3. 分析函数声明
    具体步骤如下:

函数在运行的瞬间,生成一个活动对象(Active Object),简称AO
第一步:分析参数:
函数接收形式参数,添加到AO的属性,并且这个时候值为undefine,即AO.age=undefine
接收实参,添加到AO的属性,覆盖之前的undefine
第二步:分析变量声明:如var age;或var age=18;
如果上一步分析参数中AO还没有age属性,则添加AO属性为undefine,即AO.age=undefine
如果AO上面已经有age属性了,则不作任何修改
第三步:分析函数的声明:
如果有function age(){}把函数赋给AO.age ,覆盖上一步分析的值

函数在运行的瞬间,生成一个活动对象,简称AO;

  • 第一步:分析参数:
    - 函数接收形式参数,添加AO的属性,并且这个时候值为undefine,即AO.age = undefine;接收实参,添加到AO的属性,并且这个时候值为undefine
  • 第二步:分析变量声明:如var age;或var age = 18;
    - 如果上一步分析参数中AO还没有age属性,则添加AO属性为undfine,即AO.age = undfine;如果上面已经有age的属性,则不作任何修改
  • 第三步:分析函数声明:
    - 如果有function age(){}把函数赋给AO.age,覆盖上一步分析的值
 1 function func(age) {
 2     console.log(age);
 3     var age = 25;
 4     console.log(age);
 5     function age() {
 6     }
 7     console.log(age);
 8 
 9 }
10 func(18)

词法分析:

第一步,分析函数参数:
  形式参数:AO.age = undefined
  实参:AO.age = 18
第二步,分析局部变量:
  第3行代码有var age,但此时第一步中已有AO.age = 18,故不做任何改变
  即AO.age = 18
第三步,分析函数声明:
  第5行代码有函数age,则将function age(){}付给AO.age,即AO.age = function age() {}

所以,执行代码时:

第2行代码运行时拿到的age是词法分析后的AO.age,结果是:function age() {};

第3行代码:25赋给age,此时age=25;

第4行代码运行时age已被赋值为25,结果25;

第5,6行代码是一个函数表达式,所以不会做任何操作;

第7行代码运行时age仍然是25,结果也是25。看看浏览器执行的结果,
  答案:function age{}; 25 ; 25;