JS作用域/作用域链/变量提升----3

1|0作用域

作用域指一个变量的作用的范围                  作用范围==作用域         

作用域就是一个独立的地盘,让变量不会外泄、暴露出去。也就是说作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。

例如:

function show(){ var a='局部变量' } show() console.log(a);//a is not defined

在 JavaScript 中有两种作用域类型:

(1)全局作用域

(2)局部作用域(函数作用域 )

1|1全局作用域

直接写在 script 标签中的 JavaScript 代码都是全局作用域。当页面打开运行时全局作用域就会自动创建,而当页面关闭时就会销毁。在全局作用域中有一个全局的 window 对象可以使用,而所有全局作用域对象都会作为 window 对象的属性来使用。(为什么全局变量不会销毁,因为js执行时从上往下执行,不清楚在下面的代码中这变量有没有使用)

<script> let a = '全局作用域' console.log(a); </script>

在js代码里这个a不论在哪里都可以使用,使用完了之后,他还是存在,这种情况,变量a为全局变量

1|2局部作用域(函数作用域)

作用于函数内的代码环境,就是局部作用域。由于跟函数有关,所以也称为函数作用域。

局部作用域(函数作用域)是在调用函数时才会被创建,函数执行完毕后就自动销毁同时,每调用一次函数就会创建一个新的函数作用域,它们之间是相互独立的。
在函数作用域中可以访问全局作用域,而在全局作用域中不能访问函数作用域。当在函数作用域中使用一个变量时,它会先在自身作用域内查找,如果找到就直接使用,如果没有找到则会向上一级作用域查找,直到找到全局作用域为止。如果都没有找到则会报错。
function show(){ let a='局部作用域' } show() console.log(a);//a is not defined

当直接赋值没有声明的时候,这个变量会自动成为全局变量

function a() { b = 10 } a() console.log(b);

2|0作用链

作用域的集合就是作用域链(子集可以访问父集,父集不能访问子集)

function fn() { var a=1 function fn1() { var b=2 console.log(a);//1 function fn2() { console.log(a);//1 console.log(b);//2 } fn2() } fn1() } fn() console.log(a);//a is not defined

从作用域链的结构可以看出,函数在执行的过程中,先从自己内部寻找变量,如果找不到,再从创建当前函数所在的作用域去找,从此往上,也就是向上一级找,直到找到全局作用域还是没找到。

作用域代码优化:在运行期上下文的作用域链中,标识符所在的位置越深,读写速度就会越慢。所以在编写过程中,尽量的使用局部变量,少使用全局变量

执行顺序:就近原则

var a=10; function fn(){ var a=20; console.log(a) //20 } fn()

 


__EOF__

本文作者长安
本文链接https://www.cnblogs.com/jingxin01/p/16393640.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   长安·念  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示