JS深入学习笔记 - 第三章.变量作用域与内存

这篇具有很好参考价值的文章主要介绍了JS深入学习笔记 - 第三章.变量作用域与内存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.原始值和引用值

ECMScript变量包含两种不同类型是数据:原始值和引用值。

原始值:最简单的数据。有6中原始值:Undefined、Null、Boolean、Number、String和Symbol。原始值是按值访问。

引用值:由多个值构成的对象。三大引用类型:1.object 2.Array类型 3.Function类型。引用值是保存在内存中的对象,由于js不允许直接访问内存位置,所以对引用值的访问是访问该对象的引用而非对象本身。

这里可以类比java中的基本数据类型和引用数据类型。

2.复制

通过变量把一个原始值复制到另一个另一个变量时,原始值会在内存中增加一个值,赋值为新的变量,如num2上

let num1 = 5
let num2 = num1

 

此时修改num1 的值,猜一猜会不会对num2有影响?

      let num1 = 5;
      let num2 = num1;
      num1 = 545454;
      console.log(num2);//5

 

答案是不会的,因为在上面提到了,num1与num2对应的是两个独立的值。

JS深入学习笔记 - 第三章.变量作用域与内存

 

 

但是如果是引用值呢?

      
      let arr1 = [1,2]
      let arr2 = arr1
      arr1.push(6)
      console.log(arr2)//(3) [1, 2, 6]

欸?arr2也改变了呢,是什么原因呢?

原因是这里的复制的值实际上是一个指针,它指向存储在堆内存中的对象。他们指向的是同一个值。

 

 

JS深入学习笔记 - 第三章.变量作用域与内存

 

 

那如果传递是对象呢?

    
      //对象
      function setName(obj) {
        obj.name = "zooey";
      }
      const person = new Object();
      setName(person);
      console.log(person.name); //zooey

 

此时对象类型person复制给obj,看起来很像是引用类型的改变,

但是事实上,对象仍然是按值传进函数的,但是obj是按照引用访问的person,怎么?你不信?

      
      //对象
      function setName(obj) {
        obj.name = "zooey";
        obj = {
          name: "anan",
        };
        console.log(obj.name);//anan
      }
      const person = new Object();
      setName(person);
      console.log(person.name); //zooey

 

看吧,的确是没有改掉吧,确实是按值引用。

令人觉得很复杂,对吧。

object对象本身是按值访问的,而对象的属性则是按照引用访问的

3.确定类型

1.typeof

最适合用来判断变量是否是原始类型。更确切的说它是判断一个变量是否是字符串、数值、布尔值或者undefined的最好的方式。

      
      et str = "absce";
      let num = 12;
      let boo = true;
      let und = undefined;
      let obj = { name: "aaa" };
​
      console.log(typeof num); //number
      console.log(typeof str); //string
      console.log(typeof boo); //boolean
      console.log(typeof und); //undefined
      console.log(typeof obj); //object

 

但是,typeof对引用值的作用不大

2.instanceof

按照定义,所有引用值都是Object的实例,因此通过instanceof操作符检测任何引用值和Object构造函数都会返回true。

类似的,如果用instanceof检测原始值,则始终会返回false,因为原始值不是对象。

      let arr = [1, 23, 4];
      let fun = () => {
        console.log("i am function");
      };
      class Myclass {
        constructor() {
          name;
        }
      }
      function Cons() {
        return "sss";
      }
​
      console.log(typeof arr); //object
      console.log(typeof fun); //function
      console.log(typeof Myclass); //function
      console.log(typeof Cons); //function
​
      console.log(arr instanceof Array); //true
      console.log(fun instanceof Function); //true
      console.log(Myclass instanceof Function); //true
      console.log(Cons instanceof Function); //true

 

4.执行上下文和作用域

1.什么是执行上下文(以下简称上下文)?

变量和函数的上下文决定了它们可以访问哪些数据,以及他们的行为。

每个上下文都有一个关联 变量对象(variable object),而这个上下文中定义的所有变量和函数都存在于这个对象上。虽然没办法通过代码真正的访问它。

2.什么是全局上下文?

最外层的上下文。在浏览器中,全局上下文就是我们常说的window对象,因此,所有通过var定义的全局变量和函数都会成为window对象的属性和方法

3.上下文什么时候销毁?

上下文在其所有的代码都执行完毕后会被销毁,包括定义在它上面的所有变量和函数。

全局上下文在应用程序退出前才会被销毁,比如关闭页面或者退出浏览器。

4.上下文的执行流程

每个函数调用都有自己的上下文。当代码执行流进入到函数时,函数的上下文被推到一个上下文栈上,在函数执行文之后,上下文栈会弹出该函数上下文,将控制器泛黄之前的执行上下文。ECMAScript程序的执行流就是通过这个上下文栈进行控制的。

 

上下文中代码在执行的时候,会创建变量对象的一个作用域链(scope chain),这个作用域链决定看各级上下文中代码在访问变量和函数时的顺序。代码正在执行的上下文的变量对象始终位于作用域的最前端。

5.标识符解析在上下文中的寻找规则

代码执行时的标识符解析时通过沿着作用域链逐级搜索标识符名称完成的。搜索过程始终从作用域链的最前端开始,然后逐级往后,直到找到标识符。(如果没有找到则会报错)

    
      let name = "zooey";
      function getName() {
        let myname = "anan";
        if (name === "zooey") {
          name = myname;
        } else {
          name = "zooey";
        }
      }
      getName();
      console.log(name); //anan

 

在这个例子中,函数getName的作用域链包含两个对象“一个是他自己的变量对象myname,一个是全局上下文的变量对象name,之所有能够访问color,就是因为可以在作用域链中找到它。

此外,局部作用域中定义的变量可以用于在局部上下文中替换全局变量。

 

总结一下:

类似于java的局部变量和全局变量,

局部上下文中的变量只能在本作用域中使用

全局上下文中的变量可以在全局使用

如果包含嵌套关系,那么父作用域中的变量,子作用域也可以使用 。

即,内部上下文可以通过作用域链访问外部上下文中的一切,但外部上下文无法访问内部上下文中的任何东西。

每个上下文都可以到上一级上下文中去搜索变量和函数,但任何上下文都不能去下一级上下文中去搜索。

(此处举一个不恰当的例子,儿子可以继承父亲的房子,换掉父亲的凳子椅子,但是父亲不能继承儿子的房子,换掉儿子的家具,儿子会生气的~)

注意:函数参数(形参)被认为是当前上下文中的变量,因此也跟上下文中的其他变量遵循相同的访问规则。文章来源地址https://www.toymoban.com/news/detail-710049.html

到了这里,关于JS深入学习笔记 - 第三章.变量作用域与内存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《Flink学习笔记》——第三章 Flink的部署模式

    不同的应用场景,有时候对集群资源的分配和占用有不同的需求。所以Flink为各种场景提供了不同的部署模式。 3.1 部署模式(作业角度/通用分类) 根据集群的 生命周期 、 资源的分配方式 、 main方法到底在哪里执行 ——客户端还是Client还是JobManager、 资源管理 将Flink的部署

    2024年02月10日
    浏览(29)
  • Django学习笔记:第三章D的路由和视图

    URL是网站Web服务的入口。用户在浏览器输入URL发出请求后,django会根据路由系统,运行对应的视图函数,然后返回信息到浏览器中。 创建项目时,会自动生成urls.文件,文件中定义了项目的路由信息,成为项目的路由解析入口。在自建的应用中可以手动配置独立的urls.py文件。

    2024年02月16日
    浏览(30)
  • 《现代密码学》学习笔记——第三章 分组密码 [二] AES

    版本 密钥长度 分组长度 迭代轮数 AES-128 4 4 10 AES-192 6 4 12 AES-256 8 4 14 (1)字节代换(SubByte) (2)行移位(ShiftRow) (3)列混合(MixColumn) (4)密钥加(AddRoundKey) 1.字节代换   字节代换是非线性变换,独立地对状态的每个字节进行。代换表(S-Box)是可逆的。   将

    2024年02月05日
    浏览(70)
  • 【UnityShader入门精要学习笔记】第三章(1)Unity Shader介绍

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 从本章节开始我们要学习Shader相关的知识了,诸位看客可能有的

    2024年02月02日
    浏览(46)
  • 数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv)

    本系列博客参考书为, 数字图像处理第三版-冈萨雷斯 第三版教材中图片下载地址: book images downloads vs2019配置opencv可以查看:VS2019 Opencv4.5.4配置教程 后续剧情: 数字图像处理 第四章 频率域滤波 学习笔记 数字图像处理 第六章 彩色图像处理 学习笔记 数字图像处理 第七章 小

    2024年02月03日
    浏览(33)
  • 【计算机网络】学习笔记:第三章 数据链路层【王道考研】持续更新中....

    基于本人观看学习b站王道计算机网络课程所做的笔记,不做任何获利 仅进行交流分享 特此鸣谢王道考研 若有侵权请联系,立删 如果本篇笔记帮助到了你,还请点赞 关注 支持一下 ♡𖥦)!! 主页专栏有更多,如有疑问欢迎大家指正讨论,共同进步! 给大家跳段街舞感谢支持

    2024年02月01日
    浏览(39)
  • 概率第三章 二维随机变量及其分布

    目录 一、二维随机变量及其分布 1、二维随机变量 2、二维离散型随机变量(X,Y) 3、二维连续型随机变量(X,Y) 二、二维随机变量的独立性 三、二维均匀分布和二维正态分布 二维均匀分布 二维正态分布 四、二个随机变量函数Z=g(X,Y)的分布 X、Y均为离散型随机变量: X、Y均为连续

    2024年02月09日
    浏览(46)
  • 【UnityShader入门精要学习笔记】第三章(2)Unity Shader的形式,章节答疑

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 (该系列笔记中大多数都会复习前文的知识,特别是前文知识非

    2024年02月02日
    浏览(34)
  • 【计算机网络】学习笔记:第三章 数据链路层(八千字详细配图)【王道考研】

    基于本人观看学习b站王道计算机网络课程所做的笔记,不做任何获利 仅进行交流分享 特此鸣谢王道考研 若有侵权请联系,立删 如果本篇笔记帮助到了你,还请点赞 关注 支持一下 ♡𖥦)!! 主页专栏有更多,如有疑问欢迎大家指正讨论,共同进步! 给大家跳段街舞感谢支持

    2024年02月06日
    浏览(44)
  • Three.js第三章——透视投影相机

            Threejs提供了正投影相机 OrthographicCamera (opens new window) 和透视投影相机 PerspectiveCamera (opens new window) 。         透视投影相机  PerspectiveCamera  本质上就是在模拟人眼观察这个世界的规律。         生活中用相机拍照,你相机位置不同,拍照结果也不同,

    2024年04月29日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包