js高级_109、作用域与作用域链

作用域

理解

*就是一块地段,一个代码段所在的区域。

*它是静态的(相对于上下文对象),在编写代码时就确定了。

分类:

全局作用域

函数作用域

块作用域(ES6)

作用:

隔离变量,不同作用域下的同名变量不会有冲突。

var a=10,b=20;
	function fn(x){
		var a=100,c=300;
		console.log('fn(x)',a,b,c,x);
		function bar(x){
			var a=1000,d=400;
			console.log('bar(x)',a,b,c,d,x);
		}
		
		bar(100);
		bar(200);
		
	}
	
	fn(10);
	

结果:
//100,20,300,10
//1000,20,300,400,100
//1000,20,300,400,200
image



作用域与执行上下文对象

区别1

全局作用域之外,每个函数都会创建自己的作用域(函数作用域),作用域在函数定义时就已经确定了,而不是在函数调用时确定。

全局执行上下文环境(对象)是在全局作用域确定之后,js代码马上执行之前创建。

函数执行上下文环境(对象)是在调用函数时,函数体代码执行前创建。

区别2

函数作用域是静态的,只要函数定义好了就一直存在,且不会再变化。

函数执行上下文环境(对象)是动态的,调用函数时创建,函数调用结束时上下文环境就会自动释放。

联系

执行上下文环境(对象)是从属于所在的作用域。

全局执行上下文环境= =》全局作用域。
函数执行上下文环境= =》对应的函数作用域。

image



作用域链

理解:

多个上下级关系的作用域形成的链,它的方向是由内向外的。

查找变量时就是沿着作用域链查找。

查找一个变量的查找规则:

①在当前作用域下的执行上下文对象中查找对应的属性,有则返回,否则进入②。
②在上一级作用域的执行上下文对象中查找对应的属性,有则返回,否则进入③。
③再次执行②的相同操作,直到全局作用域,如果还没找到就抛异常。
image




面试题

1、

作用域在编码(就是你在写代码的时候)的是时候就创建好了,所以fn的上一级还是全局作用域,也就是fn不是定义在show函数里面的。
image

2、

var obj={
	fn2:function(){
		console.log(fn2);
	}
}

obj.fn2();

结果会报错,因为在当作作用域和obj作用域和全局作用域都没找到变量fn2,对象里的fn2不是变量,是属性。如果要找可以用this.fn2

posted @ 2022-03-14 11:40  青仙  阅读(26)  评论(0编辑  收藏  举报