【Javascript Day8】计算机存储方式、方法定义方式、作用域、预解析、对象

目录

计算机存储方式

方法的定义方式

声明式方法

表达式方式方法

作用域

变量作用域对代码影响

  1. 全局变量和局部变量重名

 2. 方法内不使用 var 定义变量对全局变量的影响

 3. 变量名和参数名重复

4. 作用域链 :作用域嵌套产生的作用域父子子孙关系

5. 嵌套作用域的变量相互访问

js预解析

1. var变量的变量提升

2. 声明式函数提升

3. 表达式函数提升

对象


计算机存储方式


// 计算机的软件运行时的内存使用而言,数据的存储方式主要分为两种存储区域
        //      栈空间:栈空间的存储容量受限 => 读取和查找变量的速度会更快
        //      堆空间:堆空间理论上容器是无限 => 存储更多数据

        // 数据的存储方式
        //  1. 基本类型:Number String Boolean null undefined
        //  2. 引用数据类型(复杂数据类型):Array

        // 变量名会被直接记录在 栈空间中,方便程序运行时的快速加载
        //      变量值的存储会因为类型不同存储区域不同
        //          1. 基本类型:值直接存在栈中,和变量名在一起
        //          2. 引用类型:存在堆中,通过内存地址编码进行关联,栈中的变量绑定时堆中的地址

        var num = 100; // 定义一个变量num 值为 100
        var num1 = num; // 定义一个变量 num1 值从 num 变量获取 => 100
        console.log(num,num1);
        
        num1 = 200; // 对变量 num1 进行重新赋值,取值200
        console.log(num,num1);

        // 因为 = 赋值运算只操作栈
        var arr = [1,2,3,4,5]; // 定义一个变量 arr ,值为 [1,2,3,4,5]
        var arr1 = arr; //定义一个变量 arr1, 值从 arr 变量获取 => [1,2,3,4,5]
        console.log(arr,arr1);
        
        arr1[0] = 999;
        console.log(arr,arr1); // [999,……] [999,……]

        arr1 = ["a","b","c"]; // 重新赋值一个全新的数据,所有堆提供一个新的地址
        console.log(arr,arr1);
        

        // 数据不同存储方式对方法参数的影响


//     方法参数传递会因为数据类型不同,分为 值传递 和 引用传递
        //          1. 值传递:将基本数据类型数据作为参数传递
        //          2. 引用传递:将引用数据类型的堆地址作为参数进行传递
        function printParams(a,b){
            a = "新数据";
            b[0] = 999;
            // 重新给b赋值了一个堆的指向数组地址,此时的b和传递的arr之间没有关系了
            b = [66,77,88];
            b[0] = 1111;
        }

        var str = "abc";
        var arr = [11,22,33]

        console.log(str,arr); // abc [11,22,33]
        
        // str 传递的是值 ,内部的修改不会影响到 str 变量本身  => 值传递
        // arr 传递的是地址 ,内部在不修改地址的情况下会影响的 arr 变量本身 => 引用传递
        printParams( str,arr )

        console.log(str,arr); // abc  [999,22,33]

方法的定义方式

声明式方法

   function show(){

        }

表达式方式方法

        //   => 以变量的规则声明
        var printFun = function(a,b){
            return a + b;
        }

        var res = printFun("a",123);

        console.log(res);

作用域

// 作用域:代码对变量或方法使用范围的一种限制
        //        让数据不会变成 脏数据

        // js作用域
        //     1. 全局作用域:同一个HTML加载的JS代码都可以直接访问的作用域
        //                  全局作用域声明的变量或者方法,在当前html的任何JS位置中都可以直接被访问
        //                  浏览器全局作用域实际上就是,JS提供窗口数据 window
        //                  浏览器加载JS时就会初始化变量值,当浏览器关闭时才会删除
        //     2. 局部作用域:声明的方法的方法体
        //                  每个方法的方法体范围就是一个局部作用域
        //                  局部作用域声明的变量或方法只能在当前作用域中使用
        //                  局部变量只有在方法被执行时才会初始化变量值,当方法执行完成后会进行删除

        // 全局变量声明 => 数据存在window上
        var people = "abc";
        var num = 100;

        console.log(window);
        // 直接使用全局变量名
        console.log("同script",num);
        // 通过  window.变量名  进行使用
        console.log("同script",window.num);

        
        // 局部作用
        function funA(){
            var count = 10;
            return count;
        }

        // 把方法返回的结果,重新定义成一个全局变量
        var a = funA();

        // 受作用域限制,方法外无法直接调用方法内的变量
        console.log(count);
        
        // console.log(a);


变量作用域对代码影响

  1. 全局变量和局部变量重名

       var msg = "全局msg";

        function printFunA(){
            console.log(msg);
        }
        printFunA(); // 输出:全局作用域变量msg

        // 就近原则
        function printFunB(){
            var msg = "局部msg";
            // 方法内无法获取全局变量msg
            console.log(msg); // 获取局部变量msg
        }
        printFunB(); // 输出:局部作用域变量msg
        console.log(msg); // 输出:全局作用域变量msg

 2. 方法内不使用 var 定义变量对全局变量的影响


        //      JS 变量定义时,只有具有声明符号 var 的变量表示为重新定义
        //                   如果变量定义时,没有使用 var ,会首先查询是否存在该变量:
        //                         如果存在直接使用,不存重新定义
        //                         如果不存在,重新定义全局变量
        var info = "全局info";
        function printFunC(){
            info = "局部info"; // 对全局变量 info 进行覆盖
            console.log(info);
        }
        printFunC(); // 输出:局部变量info
        console.log(info); // 输出:局部变量info
        
        function printFunD(){
            text = "局部text";
            console.log(text);
        }
        printFunD(); // 输出:局部text
        console.log(text); // 输出:局部text
        

 3. 变量名和参数名重复


        var num = 1000;
        function printFunE(num){
            // 方法形参是存在一个 隐藏的 var 关键字,所以形参是新变量定义,形参变量属于局部作用域
            console.log(num);
            num = 999;
            console.log(num);
        }
        printFunE(); // 输出:undefined , 999
        console.log(num); // 输出:1000 
        

4. 作用域链 :作用域嵌套产生的作用域父子子孙关系


        var flag = false;
        function printFunF(){

            // 局部方法
            // function printFunG(){
            //     console.log(flag);
            // }
            var printFunG = function(){
                console.log(flag); // 查找到了全局的 flag
            }
            printFunG(); // 输出:false

        }
        printFunF(); // 输出:没有任何输出
        // printFunG(); // 输出:报错 => 全局没有该方法

        var name = "张三";
        function printFunH(){
            var name = "李四";
            function printFunI(){
                console.log(name);
            }
            printFunI(); // 输出:李四
        }
        printFunH();


5. 嵌套作用域的变量相互访问


        function printFunJ(){
            var argA = "printFunJ-argA-变量";

            function printFunK(){
                var argB = "printFunK-argB-变量"
                console.log(argA);
            }
            printFunK();  // 输出:printFunJ-argA-变量

            console.log(argB); // 输出: 报错
        }
        printFunJ();

js预解析

// 预解析:浏览器先完成JS加载,加载完成后会进行运行
        //       加载的过程中,JS解析器会对一些特殊结构代码进行调整,保证浏览器正常运行

1. var变量的变量提升


        // console.log(msg); // 报错 ReferenceError: msg is not defined
        
        // 被提升的info
        // var info;
        console.log(info); // undefined => 触发预解析              //16行

        var info = "测试数据";                                //18行
        // 预解析 发现 16 使用了 18 的变量 
        // 将18行的变量拆分成两部分:var info;   info="测试数据";
        // 将声明提升到 16 之前定义;
        // info = "测试数据"; // 拆分后的赋值
        
        
        function showFun(){
            // 变量提升也受 作用域限制
            console.log(text);
            var text = "text变量";
        }
        showFun();
        // console.log(text);
        

2. 声明式函数提升


        //         声明式函数是一个整体语法,不能拆分的

        // testFun(); // ReferenceError: testFun is not defined

        printFunA();                                     39行
        // 因为是声明式函数,代码解析式,发现39需要调用41行代码,41行的方法代码会被整体提前
        function printFunA(){                      
            console.log("printFunA方法");
        }

3. 表达式函数提升


        printFunB(); // TypeError: printFunB is not a function
        // 代码解析式,发现47需要调用49行代码,
        // 49行被分解成   var printFunB;   printFunB = function(){……}
        // var printFunB 被提升到47行之前
        // 提升后的变量没有被赋值,默认值是undefined,不是一个方法,不能被()调用,所以47行报错
        var printFunB = function(){
            console.log("printFunB方法");
        }

对象

// 对象:是一组无序的相关属性和方法的集合
        //      是一种代码中定义的数据格式,用于统一记录物品或者事物的相关信息
        
        // var car = ["发动机","车架","轮子"];
        // console.log( car[1] );

        // 字面量对象定义:
        /*
            key 自定义对象属性名称 = 变量声明
            value 属性的取值 = 变量赋值            var 对象名 = { 
                key:value,
                key1:value1,
                ……
            };
        */
       

 var car = {motor:"四缸发动机",frame:"铝合金",seat:"真皮"};// 对象的取值  对象变量名称.对象属性名console.log( car.motor );var stu = {no:10001,name:"tom",age:23,sex:"男"}console.log( stu.name );console.log( stu.age );console.log( stu.sex );var songList = [// 存储很多歌曲{img:"http://p1.music.126.net/WCE6Za49yYQyDvnNJykJ-w==/109951170209787177.jpg?param=140y140",count:4399,name:"我的歌声1",singer:"张三1"},{img:"http://p1.music.126.net/WCE6Za49yYQyDvnNJykJ-w==/109951170209787177.jpg?param=140y140",count:3000,name:"我的歌声2",singer:"张三2"},{img:"http://p1.music.126.net/WCE6Za49yYQyDvnNJykJ-w==/109951170209787177.jpg?param=140y140",count:200,name:"我的歌声3",singer:"张三3"},{img:"http://p1.music.126.net/WCE6Za49yYQyDvnNJykJ-w==/109951170209787177.jpg?param=140y140",count:6666666,name:"我的歌声4",singer:"张三4"},{img:"http://p1.music.126.net/WCE6Za49yYQyDvnNJykJ-w==/109951170209787177.jpg?param=140y140",count:200,name:"我的歌声3",singer:"张三3"},{img:"http://p1.music.126.net/WCE6Za49yYQyDvnNJykJ-w==/109951170209787177.jpg?param=140y140",count:666,name:"我的歌声4",singer:"张三4"}];// console.log( songList[1].name );for (var i = 0; i < songList.length; i++) {// console.log( songList[i] );// console.log( songList[i].img );document.write("<div class='box'>")document.write(`<img src="${songList[i].img}">`)// console.log( songList[i].count );var num = parseInt( songList[i].count/10000);var temp = num>1 ? num+"万":songList[i].countdocument.write(`<div>播放量:${ temp  }</div>`)// console.log( songList[i].name );document.write(`<div>名字:${songList[i].name}</div>`)// console.log( songList[i].singer );document.write(`<div>演唱者:${songList[i].singer}</div>`)document.write("</div>")}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/67335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue脚手架开发 Vue2基础 VueRouter的基本使用 vue-router路由案例

vue-router路由 Vue脚手架开发&#xff0c;创建项目&#xff1a;https://blog.csdn.net/c_s_d_n_2009/article/details/144973766 Vue Router&#xff0c;Vue Router | Vue.js 的官方路由&#xff0c;Vue.js 的官方路由&#xff0c;为 Vue.js 提供富有表现力、可配置的、方便…

Windows远程桌面网关出现重大漏洞

微软披露了其Windows远程桌面网关&#xff08;RD Gateway&#xff09;中的一个重大漏洞&#xff0c;该漏洞可能允许攻击者利用竞争条件&#xff0c;导致拒绝服务&#xff08;DoS&#xff09;攻击。该漏洞被标识为CVE-2025-21225&#xff0c;已在2025年1月的补丁星期二更新中得到…

c语言----------内存管理

内存管理 目录 一。作用域1.1 局部变量1.2 静态(static)局部变量1.3 全局变量1.4 静态(static)全局变量1.5 extern全局变量声明1.6 全局函数和静态函数1.7 总结 二。内存布局2.1 内存分区2.2 存储类型总结2.3内存操作函数1) memset()2) memcpy()3) memmove()4) memcmp() 2.4 堆…

【2024年华为OD机试】 (C卷,100分)- 堆栈中的剩余数字(Java JS PythonC/C++)

一、问题描述 题目描述 向一个空栈中依次存入正整数&#xff0c;假设入栈元素 n(1<n<2^31-1)按顺序依次为 nx…n4、 n3、n2、 n1, 每当元素入栈时&#xff0c;如果 n1n2…ny(y 的范围[2,x]&#xff0c; 1<x<1000)&#xff0c;则 n1~ny 全部元素出栈&#xff0c;重…

Java安全—SPEL表达式XXESSTI模板注入JDBCMyBatis注入

前言 之前我们讲过SpringBoot中的MyBatis注入和模板注入的原理&#xff0c;那么今天我们就讲一下利用以及发现。 这里推荐两个专门研究java漏洞的靶场&#xff0c;本次也是根据这两个靶场来分析代码&#xff0c;两个靶场都是差不多的。 https://github.com/bewhale/JavaSec …

51单片机入门基础

目录 一、基础知识储备 &#xff08;一&#xff09;了解51单片机的基本概念 &#xff08;二&#xff09;掌握数字电路基础 &#xff08;三&#xff09;学习C语言编程基础 二、开发环境搭建 &#xff08;一&#xff09;硬件准备 &#xff08;二&#xff09;软件准备 三、…

基于Java的百度AOI数据解析与转换的实现方法

目录 前言 一、AOI数据结构简介 1、官网的实例接口 2、响应参数介绍 二、Java对AOI数据的解析 1、数据解析流程图 2、数据解析实现 3、AOI数据解析成果 三、总结 前言 在当今信息化社会&#xff0c;地理信息数据在城市规划、交通管理、商业选址等领域扮演着越来越重要的…

【WEB】网络传输中的信息安全 - 加密、签名、数字证书与HTTPS

文章目录 1. 概述2. 网络传输安全2.1.什么是中间人攻击2.2. 加密和签名2.2.1.加密算法2.2.2.摘要2.2.3.签名 2.3.数字证书2.3.1.证书的使用2.3.2.根证书2.3.3.证书链 2.4.HTTPS 1. 概述 本篇主要是讲解讲一些安全相关的基本知识&#xff08;如加密、签名、证书等&#xff09;&…

shell练习2

需求&#xff1a;判断192.168.1.0/24网络中&#xff0c;当前在线的ip有哪些&#xff0c;并编写脚本打印出来。 #!/bin/bashnmap -sn 192.168.1.0/24 | grep Nmap scan report for | awk {print $5} 注意&#xff1a;当运行 bash ip.sh 时出现 nmap: command not found 的错误…

【运维自动化-作业平台】魔法变量到底如何使用之主机列表类型

蓝鲸作业平台&#xff0c;以下简称作业平台或JOB平台 魔法变量&#xff1a;JOB平台执行引擎提供的特有的变量能力用法 脚本中使用&#xff0c;并且需要事先声明&#xff1a;job_import {{变量名}} 声明后&#xff0c;同样是使用 dollar 符 大括号&#xff1a;${变量名}来取值…

活动预告 | CCF开源发展委员会开源供应链安全技术研讨会(2025第一期)——“大模型时代的开源供应链安全风控技术”...

点击蓝字 关注我们 CCF Opensource Development Committee CCF开源发展委员会开源供应链安全工作组&#xff08;以下简称CCF-ODC-OSS&#xff09;将于1月17日下午在北京黄大年茶思屋举行2025年第一期开源供应链安全技术研讨会&#xff0c;此次研讨会主题为“大模型时代的开源供…

XML序列化和反序列化的学习

1、基本介绍 在工作中&#xff0c;经常为了调通上游接口&#xff0c;从而对请求第三方的参数进行XML序列化&#xff0c;这里常使用的方式就是使用JAVA扩展包中的相关注解和类来实现xml的序列化和反序列化。 2、自定义工具类 import javax.xml.bind.JAXBContext; import javax.x…

基于php求职招聘系统设计

基于php求职招聘系统设计 摘要 随着社会信息化时代的到来&#xff0c;如今人们社会的生活节奏普遍加快&#xff0c;人们对于工作效率的要求也越来越高&#xff0c;企业 举办招聘会耗时耗财&#xff0c;个人参加招聘会漫无目的寻找不到“方向”&#xff0c;网络搜索工作量目的…

SDK调用文心一言如何接入,文心一言API接入教程

一、前期准备 注册百度智能云账号&#xff1a; 前往百度智能云官网注册一个账号。这是接入文心一言API的基础。 了解API接口&#xff1a; 在百度智能云开放平台中&#xff0c;找到文心一言API的详情页&#xff0c;了解提供的API接口类型&#xff08;如云端API、移动端API、离线…

【机器学习】数据拟合-最小二乘法(Least Squares Method)

最小二乘法&#xff08;Least Squares Method&#xff09; 最小二乘法是一种广泛使用的数据拟合方法&#xff0c;用于在统计学和数学中找到最佳拟合曲线或模型&#xff0c;使得观测数据点与模型预测值之间的误差平方和最小化。以下是详细介绍&#xff1a; 基本概念 假设有一组…

Flutter 多终端测试 自定义启动画面​​​​​​​ 更换小图标和应用名称

多终端测试 flutter devices flutter run -d emulator-5554 flutter run -d emulator-5556 自定义启动画面 之前&#xff1a; 进入assert 3x 生成 1x 2x dart run flutter_native_splash:create dart run flutter_native_splash:remove 现在&#xff08;flutter_nativ…

springMVC实现文件上传

目录 一、创建项目 二、引入依赖 三、web.xml 四、编写上传文件的jsp页面 五、spring-mvc.xml 六、controller 七、运行 一、创建项目 二、引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.o…

Java内存与缓存

Java内存管理和缓存机制是构建高性能应用程序的关键要素。它们之间既有联系又有区别&#xff0c;理解这两者对于优化Java应用至关重要。 Java 内存模型 Java内存模型&#xff08;JMM&#xff09;定义了线程如何以及何时可以看到其他线程修改过的共享变量的值&#xff0c;并且规…

图片和短信验证码(头条项目-06)

1 图形验证码接口设计 将后端⽣成的图⽚验证码存储在redis数据库2号库。 结构&#xff1a; {img_uuid:0594} 1.1 创建验证码⼦应⽤ $ cd apps $ python ../../manage.py startapp verifications # 注册新应⽤ INSTALLED_APPS [django.contrib.admin,django.contrib.auth,…

云服务信息安全管理体系认证,守护云端安全

在数据驱动的时代&#xff0c;云计算已成为企业业务的超级引擎&#xff0c;推动着企业飞速发展。然而&#xff0c;随着云计算的广泛应用&#xff0c;信息安全问题也日益凸显&#xff0c;如同暗流涌动下的礁石&#xff0c;时刻威胁着企业的航行安全。这时&#xff0c;云服务信息…