JavaScript入门第十八章(js作用域及变量预解析 )

简介: JavaScript入门第十八章(js作用域及变量预解析 )

1.js作用域


1.作用域:变量起作用的范围

* 2.js中只有两种:全局作用域  局部作用域
           *   * 全局作用域:变量在任何地方起作用
          * 全局变量:在函数外面声明 
  * 局部作用域:变量只能在函数内部起作用(又叫块级作用域)
              * 局部变量:在函数内部声明


<script>
    //1.全局变量
    let a = 10;
    function fn (  ) {
        console.log ( a );
    }
    fn();
    //2.局部变量
    function fn1 (  ) {
        let num = 10;
        console.log ( num );
    }
    fn1();
    console.log ( num );
</script>


2.作用域链


  • 1.作用域链是怎么来的
  • 默认情况下,我们的js代码处于全局作用域,当我们声明一个函数时,此时函数体会开辟一个局部作用域, 如果我们在这个函数体中又声明一个函数,那么又会开辟一个新的局部作用域,以此类推,就会形成一个作用域链


  • 2.变量在作用域链上的访问规则
  • 就近原则:访问变量时,会优先访问的是在自己作用域链上声明的变量,如果自己作用域链上没有声明这个变量,那么就往上一级去找有没有声明这个变量,如果有就访问,如果没有就继续往上找有没有声明,直到找到0级作用域链上,如果有,就访问,如果没有就报错


代码展示:


       let num = 10; // 0级链   全局作用域链
       // 0级作用域
       function f1 (  ) { // 函数变量f1本身还是处于0级链(变量f1本身处在全局作用域中,是一个全局变量。函数体中才是局部变量,也就是局部作用域链)
           let num = 20; // 1级链
           console.log ( num ); // 20
           function f2 (  ) { // 1级链
               // 2级链
               console.log ( num ); // 20,当前作用域链未声明,就会找上级作用域链的num变量
               num += 100; // 当前作用域链未找到,会从上级寻找 num = 20 + 100
               console.log ( "二级链" + num ); // 2级链  120
           }
           f2();
           console.log ( "一级链" + num ); // 120   为什么不是20:因为二级链上并没有声明变量,而是直接获取父级变量修改
       };
       // 0级作用域
       f1();
       // 0级作用域
       console.log ( "0级链" + num );// 10


3.js预解析


  • 1.为什么要有预解析机制?
  • 通过前面的学习我们知道,js代码是从上往下执行的,这样有什么不好的地方呢?
  • 实际开发中,往往一个文件中js代码会有很多的函数,而如果我们都把函数的声明写在最上面,那么我们的业务逻辑就会在下面,这样的话开发效率不高
  • 函数毕竟只是保存一段代码的,我们希望可以将函数写在页面的下面,而把一些业务逻辑功能写在代码上面,这样的话维护起来更方便


  • 2.什么是预解析机制
  • (1)其实js代码并不是从上往下执行的,这种说法不严谨
  • (2)预解析:JS在执行代码之前,会把变量的声明提前到所在作用域的最顶端
  • a.只是声明提前(相当于提前开辟内存空间),变量的赋值与函数的调用还是在原地
  • b.函数的声明也会提前


  • 3.预解析的意义(好处)
  • 让函数可以在任意地方调用


  console.log ( num ); // undefined
       var num = 10;
       console.log ( num ); // 10
       /*
       let num;
       console.log ( num );
       num = 10;
       console.log ( num );
        */
       fn();
       function fn () {
           console.log ( num );
           console.log ( "嘿嘿嘿" );
           var num = 10;
           console.log ( num );
           /*
           // 函数声明提前
           function fn(){
            var num;
           console.log ( num ); // undefined
           console.log ( "嘿嘿嘿" );
           num = 10;
           console.log ( num ); // 10
           }
           // 调用语句在原地不变
           fn()
            */
       // }
相关文章
|
资源调度 JavaScript 前端开发
Day.js极简轻易快速2kB的JavaScript库-替代Moment.js
dayjs是一个极简快速2kB的JavaScript库,可以为浏览器处理解析、验证、操作和显示日期和时间,它的设计目标是提供一个简单、快速且功能强大的日期处理工具,同时保持极小的体积(仅 2KB 左右)。
824 24
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
消息中间件 JavaScript 前端开发
最细最有条理解析:事件循环(消息循环)是什么?为什么JS需要异步
度一教育的袁进老师谈到他的理解:单线程是异步产生的原因,事件循环是异步的实现方式。 本质是因为渲染进程因为计算机图形学的限制,只能是单线程。所以需要“异步”这个技术思想来解决页面阻塞的问题,而“事件循环”是实现“异步”这个技术思想的最主要的技术手段。 但事件循环并不是全部的技术手段,比如Promise,虽然受事件循环管理,但是如果没有事件循环,单一Promise依然能实现异步不是吗? 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
892 140
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
537 2
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1402 29
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
562 4

推荐镜像

更多
  • DNS