当前位置: 首页 > news >正文

JS作用域与作用域链

让我为大家介绍一下作用域与作用域链吧!

作用域

作用域规定了变量能够访问的“范围”,离开了这个“范围”变量便不能被访问。
作用域分为:局部作用域,全局作用域

一、局部作用域

局部作用域分为函数作用域与块作用域
1.函数作用域:
在函数内部声明的变量只能在函数内部被访问,外部无法直接访问。

    function fun() {// 函数内部是函数作用域 属于局部变量let num = 10}console.log(num); //报错 函数外部不能使用局部作用域变量

总结:
1.函数内部声明的变量,在函数外部无法被访问
2.函数的参数也是函数内部的局部变量
3.不同函数内部声明的变量无法互相访问
4.函数执行完毕后,函数内部的变量实际被清空了

2.块作用域:
在javaScript中使用{ }包裹的代码称为代码块,代码内部声明的变量外部将【有可能】无法被访问。
外部无法被访问的情况:

    for (let i = 0; i < 3; i++) {// 块作用域 i只能在该代码块中被访问console.log(i);}console.log(i);// 报错 超出了i的作用域

外部可能被访问的情况:

    for (var i = 0; i < 3; i++) {// var不会产生块作用域console.log(i);}console.log(i);// 正常输出

1.let声明的变量会产生块作用域,var不会产生块作用域
2.const声明的常量也会产生块作用域
3.不同代码块之间的变量无法相互访问
4.推荐使用 let 或 const

二、全局作用域

script标签.js文件的【最外层】就是所谓的全局作用域,在此声明的变量在函数内部也可以被访问。
全局作用域中声明的变量,任何其它作用域都可以被访问

    // 全局作用域下声明了num变量let num = 1function fun() {// 函数内部可以使用全局作用域的变量console.log(num);//1}fun()

注意:
1.为window对象动态添加的属性默认也是全局的,不推荐
2.函数中未使用任何关键字声明的变量为全局变量,不推荐
3.尽可能少声明全局变量,防止全局变量被污染

作用域链

作用域链本质是底层的变量查找机制
在函数被执行时,会优先查找当前函数作用域中查找变量
如果当前作用域查找不到则会依次逐级查找父级作用域直到全局作用域

    // 全局作用域let num1 = 1let num2 = 2// 局部作用域function fun1() {let num1 = 1// 局部作用域function fun2() {num1 = 2console.log(num1) //2}fun2() //调用}fun1() //调用

fun2函数中查找,没有查找到到fun1()函数中查找,如果还是没查找到,到全局作用域中查找
总结:
1.嵌套关系的作用域串联起来形成了作用域链
2.相同作用域链中按着从小到大的规则查找变量
3.子作用域能够访问父作用域,父作用域无法访问子级作用域

感谢大家的阅读!借鉴了德华(pink老师)的内容。

  • List item
http://www.lryc.cn/news/247867.html

相关文章:

  • elmentui 查看大图组件 点击图片关闭弹窗方法
  • 蓝桥杯官网练习题(最长子序列)
  • Make sure that using this pseudorandom number generator is safe here.
  • 【C/C++】常见模拟题题解
  • TikTok 购物和直播的 5 个简单技巧
  • 神经网络中BN层简介及位置分析
  • BGP基础配置
  • 【开题报告】基于深度学习的驾驶员危险行为检测系统
  • Linux云服务器打包部署前端Vue项目
  • Egg.js中Cookie和Session
  • 与 PCIe 相比,CXL为何低延迟高带宽?
  • Vue 入门指南:从零开始学习 Vue 的基础知识
  • 11.docker的网络-docker0的理解及bridge网桥模式的介绍与实例
  • 新材料制造ERP用哪个好?企业应当如何挑选适用的
  • vr小鼠虚拟解剖实验教学平台减少了受感染风险
  • 【算法萌新闯力扣】:环形链表及环形链表II
  • 10.docker的网络network-概述
  • CodeTON Round #7 (Div. 1 + Div. 2)
  • 剑指 Offer(第2版)面试题 10:斐波那契数列
  • Debian 12 / Ubuntu 22.04 安装 Docker 以及 Docker Compose 教程
  • Spark_spark参数配置优先级
  • ElasticSearch之Search settings
  • 二十二、数组(4)
  • 『 MySQL数据库 』CRUD之UD,表的数据更新(修改)及删除
  • 贪心算法及相关例题
  • 给企业做公众号运营你都有哪些宝贵经验?
  • 2023亚太地区数学建模B题思路分析+模型+代码+论文
  • Electron+Ts+Vue+Vite桌面应用系列:sqlite增删改查操作篇
  • c语言编程题经典100例——(36~40例)
  • SQL Server实现参数化增删改查Class类