Js高级程序设计第三版学习(四章)

                              Js高级程序设计第三版学习(四章)

 

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

  1.基本类型和引用类型 :  将一个值赋给一个变量时,解析器需要知道这个值是基础类型还是引用类型, 基础类型: string number null undefined Boolean 引用类型: 变量保存的是指向目标对象的指针

  • 动态属性: 创建一个变量 并为该变量 赋值, 引用类型可以添加方法、属性, 但是基础类型不可以
  • 复制变量值 : 从一个变量向另一个变量复制时, 如果基础类型, 创建一个新值, 然后把值 复制到新变量上,两个变量互相没有影响,但是,如果时引用类型, 复制的是 引用这个对象的指针, 所以两个变量会相互影响.
      var obj = new Object();
      obj.name = '我是obj1';
      var obj2 = obj;
      obj2.name = '我是obj2';
      console.log(obj.name); // 我是obj2
  • 传递参数 : 所有函数的参数都是按值传递的,基础类型会复制值给参数, 而引用类型 会把指针复制给参数,所以把对象传入函数中外部对象依然会改变.
  • 检测类型 :  typeof 用来检测基础类型, instanceof 用来检测引用类型,如果instanceof 检测了基础类型 就会返回false

  2.执行环境及作用域 :  执行环境决定了变量或函数有权访问的其他数据, 每个执行环境 都有一个与之关联的变量对象, 对象中存放着环境定义的所有变量与函数, 每一个函数都有自己的执行环境, 当 执行流进入函数, 当前环境被推入栈中(后进先出),执行完在抛掉,控制权返回到上一个执行环境, 当代码在环境中执行,会创建一个作用域链,目的是让函数与变量有序的访问,环境之间的联系是线性的,有序的,作用域链的最前端是当前代码执行的变量对象(存在当前环境的属性和方法),下一个变量对象来自包含环境,以此类推知道全局环境为止,在我们查询变量或方法的时候 只能向上搜索,我把她理解成堆积木,当代码执行在一个方法中就加一块积木,全局环境(根据宿主不同对象也不对,浏览器:window, node.js: global)就是在底层,代码只能拿到当前这块积木及其下方积木的变量,函数,但是拿不到他上方积木的变量,函数,因为它被压住了,所以没有权限,或者它的上方一无所有

  • 没有块级作用域 :  js 只有全局作用域和局部作用域(函数), 所以在for循环 if语句中 定义的变量,在for 语句结束后 是可以访问到的
  • 标识符解析 : js在查找标识符的时候,会现在当前环境下查找,如果找到了,就不会向上查找了,所以在当前环境中并不会调用上级环境中的同名标识符

3.垃圾收集 : js具有自动的垃圾收集机制, 执行环境会负责管理代码执行过程中的使用过内存

  • 标记清除 : 垃圾收集器在运行的时候 会去除环境变量与被引用变量,剩下的变量就是无法被访问的变量,会被垃圾收集器标记为准备删除,垃圾收集器最终销毁带标记的值,收回占用的内存空间,js采用标记清楚
  • 引用计数 : 记录每个值的被引用次数,声明一个变量,赋值了一个引用类型就+1,如果这个变量赋给别的变量再加1,如果这个值取了别的值就减1,如果减到0, 就代表无法访问了,就会被回收. 但是如果涉及到循环引用那么变量永远不可能等于0,也就永远不会被回收,所以许多厂商就放弃了这种方式, 然而在部分浏览器中(ie低版本),浏览器的一部分对象并不是js原生对象,浏览器本身的垃圾回收装置可能也采用了引用计数方式, 在操作这一部分对象时(BOM,DOM),如果循环引用了,那么也永远不会被回收
  • 性能问题 : 垃圾处理器是周期性运行的,如果变量分配的内存数很多,回收工作量也会很大.
  • 管理内存 : 解除引用 当数据不再有用,将其的值设置为null 来释放引用, 解除引用的真正作用是让值脱离环境,以便垃圾回收器下次运行时将其收回
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值