JS进修笔记(第4章)(变量、作用域和内存题目)

1. 基础范例和援用范例的值

JavaScript变量能够用来保留两种范例的值:基础类性值和援用类性值。基础范例值源自以下5种基础数据范例:Undefined、Null、Boolean、Number和String。基础范例值和援用类性值有以下特性:

  1. 基础范例值在内存空间中占有牢固大小的空间,因此会被保留在栈内存中;
  2. 从一个变量向另一个变量复制基础范例的值,会建立这个值的一个副本;
  3. 援用范例的值是对象,保留在堆内存中; 包含援用范例值的变量现实上包含的并非对象自身,而是一个指向该对象的指针;
  4. 从一个变量向另一个变量复制援用范例的值,复制的现实上是指针,因此两个变量终究都指向同一个对象
  5. 肯定一个值是哪一种基础范例能够运用typeof操作符,而肯定一个值是哪一种援用范例能够运用instanceof操作符。
  • 6、 只能给援用范例值动态地增添属性
  • 7、假如从一个变量向另一个变量复制基础范例的值,会在变量的对象上建立一个新值,然后把该值复制到为新变量分派的位置上;
  • 8、当从一个变量向另一变量复制援用范例的值时,一样也会将存储在变量对象中的值复制一份放到为新变量分派的空间中。差别的是,这个值的副本现实上是一个指针,两个变量现实大将援用一个对象。因此,转变个中一个变量就会影响另一变量。

2. 实行环境及作用域

一切变量(包含基础范例和援用范例)都存在于一个实行环境(也称为作用域)当中,这个实行环境决议了变量的生命周期,以及哪一部份代码能够接见个中的变量。以下是关于实行环境的几点总结:

  1. 实行环境有全局实行环境(也称全局环境)和函数实行环境之分;
  2. 每次进入一个新实行环境,都邑建立一个用于搜刮变量和函数的作用域链;
  3. 函数的部分环境变量不仅有权接见函数作用域中的变量,而且有权接见其包含(父)环境,以致全局环境;
  4. 延伸作用域链:有些语句能够在作用链的前端暂时增添一个变量对象,该变量对象会在代码实行后被移除。具体来讲就是当实行流进入以下任何一个语句时,作用域链就会获得加长:try-catch语句的catch块和with语句。这两个语句都邑在作用域链的前端增添一个变量对象。对with来讲,会将指定的对象增添到作用域链中。对catch语句来讲,会建立一个新的变量对象。
  5. 全局环境只能接见在全局环境中定义的变量和函数,而不能直接接见部分环境中的任何数据;(假如部分环境中存在着同名标识符,就不会运用位于父环境中的标识符)
  6. 变量的实行环境有助于肯定应当什么时刻开释内存;
  • 运用var声明的变量会自动被增添到最接近的环境中。如过初始化变量时没有运用var声明,该变量会自动被增添到全局环境中。

3. 渣滓网络

JavaScript是一门具有自动渣滓网络机制的编程言语,开发人员没必要体贴内存分派和接纳题目。能够对JavaScript的渣滓网络进程做以下总结:

  1. 离开作用域的值将被自动标记为能够接纳,因此将在渣滓网络时期被删除;
  2. 标记消灭“是现在主流的渣滓网络算法。这类算法的头脑是给当前不运用的值加上标记,然后再接纳其内存;
  3. 另一种渣滓网络算法是“援用计数”,这类算法的头脑是跟踪纪录一切值被援用的次数。JavaScript引擎现在都不再运用这类算法;但在IE中接见非原生JavaScript对象(如DOM元素)时,这类算法依然可能会致使题目;
  4. 当代码中存在轮回援用征象时,“援用计数”算法就会致使题目;
  5. 轮回援用指的是的对象A中包含一个指向对象B的指针,而对象B中也包含一个指向对象A的援用;
    (1)解决办法:在不运用它们的时刻手工断开原生JavaScript对象与DOM元素之间的衔接
    myObject.element = null;
    element.someObject = null;
    (2)将变量设置为null意味着割断变量与它此前援用的值之间的衔接。当渣滓网络器下次运行时,就会删除这 些值并接纳它们所占的内存
  6. 消弭变量的援用不仅有助于消弭轮回援用征象,而且对渣滓网络也有优点。为了确保有效地接纳内存,应当实时消弭不再运用的全局对象,全局对象属性以及轮回援用变量的援用;
    (1)优化内存占用的最好体式格局,就是为实行中的代码只保留必要的数据。一旦数据不再有效,最好经由过程将其设置为null来开释其援用——这个做法叫做消弭援用
    (2)消弭援用的真正作用是让值离开实行环境,以便渣滓网络器下次运行时将其接纳。

标记消灭
给存储在内存中的一切变量都加上标记,然后,它会去掉环境中的变量以及被环境中的变量援用的变量的标记。而在此之后再被加上标记的变量将被视为预备删除的变量。末了,渣滓网络器完成内存消灭事情,烧毁那些带标记的值并接纳它们所占用的内存空间。

援用计数
当声清楚明了一个变量并将一个援用类性值赋给该变量时,则这个值的援用次数就是1.假如同一个值又被赋值给另一个变量,则该值的援用次数加1。相反,假如包含对这个值援用的变量又取得了另一个值,则这个值的援用次数减1。当这个值的援用次数变成0时,则申明没有办法再接见这个值了,因此就能够将其占用的内存空间接纳返来。

    原文作者:皮卡丘丘丘
    原文地址: https://segmentfault.com/a/1190000018388686
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞