JavaScript学习-作用域

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 作用域

作用域

目的:为了提高程序的可靠性,减少命名冲突。

JS的作用域分为:

    1. 全局作用域
    2. 局部作用域

    1、全局作用域

    整个<script>标签或一个单独的JS文件

    <script>
       var num=10;
    </script>

    image.gif

    2、局部作用域

    在函数内部则是局部作用域,只在函数内部起效果和作用。

    function fn(){
      //局部作用域;
    }

    image.gif

    变量的作用域

    1、全局变量

    在全局作用域下的变量。

    varnum=10;
    console.log(num);
    functionfn(){
    console.log(num);
    }
    fn()

    image.gif

    因为num是全局变量,函数中没有另外声明一个变量,仅只有一个全局变量的num,所以函数中的num为全局变量中的num,最后结果为10。

    2、局部变量

    在局部作用域下的变量,只能在函数内部使用。

    functionfun(){
    varnum=10;
    }
    fun();
    console.log(num);

    image.gif

    因为num是在函数中的为局部变量,使用在调用函数fun()结果为10。但console.log打印的为全局变量,num仅为局部变量不能在函数外使用,所以返回的结果为num is not defined。

    如果在函数内部没有声明直接赋值的变量也属于全局变量。

    3、二者做比较

      1. 全局变量只有浏览器关闭的时候才会销毁,比较占内存资源。
      2. 局部变量当我们程序执行完毕就会销毁,比较节约内存。
      3. JS没有块级作用域(es6的时候新增的块级作用域)。
      4. 块级作用域:{ }  if{ } for{ }

      作用域链

        1. 只要是代码就至少有一个作用域。
        2. 写在函数内部的局部作用域。
        3. 如果函数中含有函数,那么在这个作用域中又可以诞生一个作用域
        varnum=10;
        functionfn(){//外部varnum=20;
        functionfun(){//内部console.log(num);
           } 
        }


        内部函数访问外部函数的变量采取的是链式查找的方式来决定取哪个值。

        JS预解析

        JS引擎执行JS分为两步:

          1. 预解析:js引擎会把js里面所有的var和function提升到当前作用域的最前面。
          2. 代码执行:按顺序从上往下执行。

          预解析分为:

            1. 变量提升:把所有的变量声明提升到当前的作用域最前面(不提升赋值操作)。
            2. 函数提升:把所有的函数声明提升到当前作用域的最前面。
            1、变量提升:console.log(num);
            varnum=10;
            ↓↓↓↓varnum;//变量提升console.log(num);
            num=10;//赋值不提升2、函数提升fun();
            varfun=function(){
            console.log(22);
            }
            ↓↓↓↓varfun;//函数提升fun();
            fun=function(){
            console.log(22);
            }

            image.gif


            预解析练习:

            通过几个练习题来熟悉预解析叭!

            1、

            varnum=10;
            fun();
            function(){
            console.log(num);
            varnum=20;
            }
            ↓↓↓↓varnum;//变量提升(全局作用域)function=fun(){
            varnum;//变量提升(局部作用域)console.log(num);
            num=10;
            }
            fun();

            image.gif

            2、

            varnum=10;
            functionfn(){
            console.log(num);
            varnum=20;
            console.log(num);
            }
            fn();
            ↓↓↓↓varnum;
            functionfn(){
            varnum;
            console.log(num);
            num=20;
            console.log(num);
            }
            num=10;
            fun();

            image.gif

            3、

            vara=18;
            fn();
            functionfn(){
            varb=9;
            console.log(a);
            console.log(b);
            vara='123';
            }
            ↓↓↓↓vara;
            functionfn(){
            varb;
            vara;
            b=9;
            console.log(a);
            console.log(b);
            a='123';
            }
            a=18;
            fn();

            image.gif

            image.gif

            目录
            相关文章
            |
            1月前
            |
            Web App开发 JavaScript 前端开发
            如何学习JavaScript?
            如何学习JavaScript?
            39 5
            |
            1月前
            |
            JavaScript 前端开发
            js的作用域作用域链
            【10月更文挑战第29天】理解JavaScript的作用域和作用域链对于正确理解变量的访问和生命周期、避免变量命名冲突以及编写高质量的JavaScript代码都具有重要意义。在实际开发中,需要合理地利用作用域和作用域链来组织代码结构,提高代码的可读性和可维护性。
            |
            1月前
            |
            自然语言处理 JavaScript 前端开发
            [JS]作用域的“生产者”——词法作用域
            本文介绍了JavaScript中的作用域模型与作用域,包括词法作用域和动态作用域的区别,以及全局作用域、函数作用域和块级作用域的特点。通过具体示例详细解析了变量提升、块级作用域中的暂时性死区等问题,并探讨了如何在循环中使用`var`和`let`的不同效果。最后,介绍了两种可以“欺骗”词法作用域的方法:`eval(str)`和`with(obj)`。文章结合了多位博主的总结,帮助读者更快速、便捷地掌握这些知识点。
            35 2
            [JS]作用域的“生产者”——词法作用域
            |
            1月前
            |
            JavaScript 前端开发 索引
            JavaScript学习第二章--字符串
            本文介绍了JavaScript中的字符串处理,包括普通字符串和模板字符串的使用方法及常见字符串操作方法如`charAt`、`concat`、`endsWith`等,适合前端学习者参考。作者是一位热爱前端技术的大一学生,专注于分享实用的编程技巧。
            24 2
            |
            1月前
            |
            存储 JavaScript 前端开发
            JavaScript学习第一章
            本文档介绍了JavaScript的基础知识,包括其在网页中的作用、如何通过JavaScript动态设置HTML元素的CSS属性,以及JavaScript中的变量类型(`var`、`let`、`const`)和数据类型(基本数据类型与引用数据类型)。通过实例代码详细解释了JavaScript的核心概念,适合初学者入门学习。
            50 1
            |
            1月前
            |
            前端开发 JavaScript 数据处理
            CSS 变量的作用域和 JavaScript 变量的作用域有什么不同?
            【10月更文挑战第28天】CSS变量和JavaScript变量虽然都有各自的作用域概念,但由于它们所属的语言和应用场景不同,其作用域的定义、范围、覆盖规则以及与其他语言特性的交互方式等方面都存在明显的差异。理解这些差异有助于更好地在Web开发中分别运用它们来实现预期的页面效果和功能逻辑。
            |
            1月前
            |
            JavaScript 前端开发
            如何在 JavaScript 中实现块级作用域?
            【10月更文挑战第29天】通过使用 `let`、`const` 关键字、立即执行函数表达式以及模块模式等方法,可以在JavaScript中有效地实现块级作用域,更好地控制变量的生命周期和访问权限,提高代码的可维护性和可读性。
            |
            1月前
            |
            JavaScript 前端开发
            javascript的作用域
            【10月更文挑战第19天javascript的作用域
            |
            2月前
            |
            JavaScript 前端开发
            JavaScript 作用域
            JavaScript 作用域是指程序中可访问的变量、对象和函数的集合。它分为函数作用域和局部作用域。函数作用域内的变量仅在函数内部可见,而全局作用域的变量在整个网页中均可访问。局部变量在函数执行完毕后会被销毁,而全局变量则在整个脚本生命周期中都存在。未使用 `var` 关键字声明的变量默认为全局变量。
            |
            2月前
            |
            JavaScript
            js学习--商品列表商品详情
            js学习--商品列表商品详情
            25 2