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

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 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()
            */
       // }
相关文章
|
3月前
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
|
3月前
|
存储 前端开发 JavaScript
JavaScript垃圾回收机制深度解析
【10月更文挑战第21】JavaScript垃圾回收机制深度解析
128 59
|
2月前
|
SQL 存储 Oracle
南大通用GBase 8s数据库游标变量解析:提升数据库操作效率
南大通用GBase 8s 数据库游标变量解析:提升数据库操作效率
|
2月前
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
67 0
|
2月前
|
前端开发 JavaScript
JavaScript新纪元:ES6+特性深度解析与实战应用
【10月更文挑战第29天】本文深入解析ES6+的核心特性,包括箭头函数、模板字符串、解构赋值、Promise、模块化和类等,结合实战应用,展示如何利用这些新特性编写更加高效和优雅的代码。
51 0
|
3月前
|
JavaScript 前端开发 开发者
原型链深入解析:JavaScript中的核心机制
【10月更文挑战第13天】原型链深入解析:JavaScript中的核心机制
42 0
|
存储 JavaScript 前端开发
JavaScript与PHP中正则
有个在线调试正则的工具,点击查看工具。下面的所有示例代码,都可以在codepen上查看到。
JavaScript与PHP中正则
|
JavaScript 前端开发 PHP
|
2月前
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
36 1
JavaScript中的原型 保姆级文章一文搞懂
|
6月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
116 2

推荐镜像

更多