一文搞懂js的作用域与作用域链

前言

一段程序代码中所用到的名字并不总是有效和可用的,限定这个名字的可用性代码范围就是这个名字的==作用域。

比如我在一个文件中定义一个变量a,在另一个文件中a无法使用。

作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字的冲突。

我们在学习前端的很多技术时,逃不开作用域的运用。比如在js中的函数,函数的作用域我们需要了解;比如在npm包的应用中,我们只能读取module.exports中向外暴露的内容;以及在vue中,我们注册组件时,有的是组件的作用域是全局性的,有的组件只能应用于某一块中。

由此可见,了解js的底层作用域相关的知识非常重要。本节博客就围绕着js的作用域相关知识进行讲解,希望能对读着朋友有帮助。

一,js的作用域

1.1 作用域

概念:作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。换句话说,作用域决定了代码区块中变量和其他资源的可见性。ES6 之前 JavaScript 没有块级作用域,只有全局作用域和函数作用域。

1.2 全局作用域

在代码中任何地方都能访问到的对象拥有全局作用域。如整个script标签或者是一个单独的js文件:
在这里插入图片描述

1.3 局部作用域

在函数内部的就是局部作用域,又叫做函数作用域,这个代码的名字只在函数内部起效果和作用:
在这里插入图片描述
请看如下代码及运行结果:
在这里插入图片描述
在这里插入图片描述
通过以上可知,两者作用域不一样,其实是互不影响的。

但是一旦在同一个作用域中有两个相同的变量,就会出问题,后出现的num会覆盖前面出现的num:
在这里插入图片描述
在这里插入图片描述

二,变量的作用域

根据作用域的不同,变量分为两种,分别是全局变量和局部变量。

2.1 全局变量

其中,全局变量使在全局作用下的变量。
如这个num:
在这里插入图片描述

2.2 局部变量

接着是局部变量,局部变量是在局部作用域下的变量,如num1:
在这里插入图片描述
如果我们在外面引用,由于是局部作用域所以会报错,只能在函数内部调用:
在这里插入图片描述
在这里插入图片描述
注意,如果在函数内部没有声明但是被赋值的变量也是全局变量,这个需要特别记忆:
在这里插入图片描述
在这里插入图片描述
还要注意的一个点是,函数的形参也是局部变量。

2.3 执行效率

全局变量存放在内存中,只有浏览器关闭时才会销毁,比较占内存资源;
而局部变量,当程序执行完毕后就会被销毁,比较节约内部资源。所以我们更喜欢使用局部变量。

三,作用域链

作用域链:内部函数访问外部函数的变量,采取的是链式查找的方式来决定取哪个值,这种结构我们称为作用域链:
在这里插入图片描述
在这里插入图片描述

采用就近原则,内部函数访问外部函数,从内向外访问,没有的话就继续往上找即可:
在这里插入图片描述

后记

本节内容讲解了作用域,变量作用域以及作用域链的相关知识,后续会更新更多的js基础知识,谢谢关注!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值