第 4 章 变量、作用域和内存问题

103 阅读4分钟

位运算符取整

方式1:与0进行或运算 x|0

将一个数 x 通过与 -1 进行与运算 x & -1

方式3:与0异或 x^0

4.1 基本类型和引用类型的值

基本类型值: 简单的数据段。 引用类型值:指那些可能由多个值构成的对象。(保存在内存中的对象)

4.1.1 动态的属性

对于引用类型的值,我们可以添加属性和方法,也可以改变和删除属性和方法。

var person = new Object();
person.name = 'hello'
console.log(person.name) // 'hello'
var name = 'hello'
name.age =12
console.log(name.age) // undefine

所以,我们只能给引用类型值动态地添加属性。

4.1.2 复制变量值

引用类型值本质是一个指针。

4.1.3 传递参数

传人引用类型即传人对象,就可以对传人的值进行改变。

function setName(Obj) {
  obj.name = "hello"
  obj = new Object(); // 重新赋值了
  obj.name = "world"
}
var person = new Object();
setName(person);
alert(person.name); // hello

当在函数内部重写obj时,这个变量引用就是一个局部对象了

4.1.4 检测类型

typeof 检测数据是不是基本数据类型

var o = new Object();
typeof o // object

instanceof 检测是什么类型的对象

var person = new Object();
var person1 = [];
console.log(person instanceof constructor); // false
console.log(person instanceof Object); // true
console.log(person1 instanceof Array); // true

4.2 执行环境以及作用域

执行环境(全局和局部(函数))

每个执行环境都有与之关联的变量对象,环境中定义的所有变量和函数都会保持在这个对象中。

1️⃣ 全局执行环境

在web浏览器中,全局执行环境是windows对象,执行环境中所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁。(例如关闭页面或者浏览器时,才回被销毁)

2️⃣ 函数执行环境

每个函数都有自己的执行环境,当代码在一个环境中执行时,会创建变量对象的一个作用域链。全局执行环境的变量对象始终都是作用域链中的最有一个对象。

4.2.1 延长作用域链

执行环境

一些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后移除。

(1)try -catch语句的catch 块 🤔 为什么?

对于catch语句来说,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明。

try-catch语句在JavaScript中用来处理异常,在catch(e){}中的错误对象组成了一个新的变量对象然后被加到了作用域的最前端。

(2)with语句

function build() {
  var qs = "hello"
  var hef = "word"
  with(location){
    var url = hef  + qs; // 这里是location.hef
  }
  return
}

4.2.1 没有块级作用域

if 语句中的变量会添加到当前的执行环境中。(只有函数才能产生局部作用域)

1、声明变量

var 声明的变量会自动添加到最近的环境中, 没有使用var声明的会添加到全局环境中。

2、查询标识符

当前没有就查询父级

4.3 垃圾收集

javaScript 具有自动垃圾收集机制,会按照固定的时间间隔周期性地执行这一操作。

环境栈

4.3.1 标记清除

当变量进入环境时,将这个变量标记为“进入环境” ,离开时标记为“离开环境”(这时可以清除了)。

4.3.2 引用计数 (不常见)

依据变量引用的次数,会有循环引用的问题。(ie中有一部分对象并不是原生的js对象。例如,其中BOM和DOM对象就是使用C++以COM(component Object Model,组件对象模型)对象的形式实现的。

4.3.3 性能问题

ie的垃圾收集器是根据内存分配量运行的,具体一点说是256个变量、4096个变量和数组元素或者64kb的字符串。达到上述任何一个临界值,垃圾回收器就会运行。

4.3.4 管理内存

🔆 在全局作用域中,数据一旦不再使用,最好通过 null 来释放应用,这个做法叫做解除引用

(适用于大多数全局变量)

const ref = use

小结

两种类型的值: 基本类型值 和 引用类型值

基本类型: undefined、Null、Boolean、Number、String

两者具有以下特点:

1、基本类型值在内存中占固定的大小空间,因此被保存在栈内存中

2、引用类型的值是对象,保存在堆内存中

3、包含引用类型值的变量,实际上是一个指向对象的指针。

4、确定一个值的类型用typeof,确定是那种引用类型用instanceof操作法。

所有变量都存在于一个执行环境中,这个执行环境决定了变量的生命周期。

  1. 执行环境有 全局执行环境 和 函数执行环境。
  2. 每次进入一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链。
  3. 变量的执行环境有助于确定何时释放内存。

关于垃圾回收机制:

  1. 应该及时解除不使用的全局对象、全局对象属性以及循环引用变量的引用。