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()
            */
       // }
相关文章
|
12小时前
|
JavaScript 前端开发
JavaScript 闭包:让你更深入了解函数和作用域
JavaScript 闭包:让你更深入了解函数和作用域
|
1天前
|
缓存 前端开发 搜索推荐
服务端渲染(SSR)与静态网站生成(SSG):Next.js入门
服务端渲染(SSR)与静态网站生成(SSG):Next.js入门
12 0
|
1天前
|
前端开发 测试技术
测Nuxt.js入坑,配置dev、test、pro三种环境的变量env
先下载一个cross-env模块,比较好控制环境
16 5
|
1天前
|
移动开发 JavaScript 前端开发
Phaser和Three.js是两个非常流行的JavaScript游戏框架
【5月更文挑战第14天】Phaser是开源的2D游戏引擎,适合HTML5游戏开发,内置物理引擎和强大的图形渲染功能,适用于消消乐等2D游戏。Three.js是基于WebGL的3D库,用于创建3D场景和应用,支持各种3D对象和交互功能,广泛应用于游戏、可视化等领域。选择框架取决于项目需求,2D选Phaser,3D选Three.js。
15 4
|
1天前
|
JavaScript 前端开发
JavaScript闭包允许内部函数访问并保留外部函数的变量,即使外部函数执行结束
【5月更文挑战第13天】JavaScript闭包允许内部函数访问并保留外部函数的变量,即使外部函数执行结束。在游戏开发中,闭包常用于创建独立状态的角色实例。例如,`createCharacter`函数生成角色,内部函数(如`getHealth`、`setHealth`)形成闭包,保存角色的属性(如生命值)。这样,每个角色实例都有自己的变量副本,不互相影响,从而实现角色系统的独立性。
21 0
|
1天前
|
存储 JavaScript 前端开发
js的变量以及运算
js的变量以及运算
13 1
|
1天前
|
JavaScript 前端开发
关于js变量
关于js变量
18 1
|
1天前
|
JavaScript 前端开发
js的变量
js的变量
15 2
|
1天前
|
Java Spring 容器
【AOP入门案例深解析】
【AOP入门案例深解析】
19 2
|
1天前
|
JavaScript 前端开发 开发者
JavaScript基础入门之浏览器控制台调试输出
本文章是对小白学习js的初级教程,也是我对自己学习经验的一种总结,文章大多采用使用案例加讲解,带动学习的方式.因为我们的天性总是喜欢有及时反馈的事物,但是学习是一个慢长的事情,而有结果的回应,才会更好的促进自己去学习,主要是对于javascript学习中的输出,有个大体上的了解,同时通过教学能够更好的使用浏览器来方便我们去学习和运行代码,也是对自己进行笔记整理,对抓住信息关键点的一种提高.

推荐镜像

更多