js 高程学习总结 第四章

来源:互联网 发布:采购数据分析报告范本 编辑:程序博客网 时间:2024/06/05 00:41

变量、作用域和内存问题

  1. 基本类型和引用类型的值
    变量可能包含两种不同数据类型的值:基本类型值(简单的数据段)和引用类型值(可能由多个值构成的对象;保存在内存中的对象,按照引用访问的)
    动态属性
    对于引用类型的值,我们可以添加属性和方法,也可以改变和删除其属性和方法;
    但是不能给基础类型添加属性;
    复制变量值
    基本类型时:会在变量对象上创建一个新值,然后将该值复制到新变量分配的位置上(互不影响);
    引用类型时:将存储在变量中的值复制一份到新变量分配的空间中,值的副本实际为一个指针,这个指针指向存储在堆中的一个对象,因此复制操作后,两个变量实际将引用同一个对象,改变其中一个会影响另一个
    传递参数
    ECMAScript 中函数的参数都是按照值传递的(可以把ECMAScript函数的参数想象成局部变量)即把函数外部的值复制给函数内部的参数,与把值从一个变量复制到另一个变量一样;向参数传递引用类型的值时,会把这个值的内存地址复制给另一个局部变量,因此这个局部变量的变化会反映在函数外部,但是如果这个局部变量又新赋值了,就不会再对原来的有影响(相当于局部变量了,函数运行后会清除)。
    检测类型
    typeof 检测基本类型,如果是null或对象,会返回“object”====返回的是string类型
    但是检测引用类型很无力,可以使用instanceof 检测具体的类型:对象、数组或者正则等
    instanceof 检测引用类型,对于基本类型都会返回false,因为基本类型不是对象

  2. 执行环境及作用域
    执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中,我们无法访问到,解析器可以。
    当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途,保证对执行环境有权访问的所有变量和函数的有序访问。
    内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。环境之间的联系是线性有次序的,只可以向上搜索作用域链,以查询变量和函数名;下级的作用域链中包含的对象:自己的变量对象和上级的变量对象,直到全局变量对象;
    延长作用域链
    执行环境的类型:全局和局部;
    延长作用域链:有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除。在下列两种语句会加长作用域链:

    • try-catch语句的catch块(创建一个新的变量对象,包含抛出的错误对象声明)
    • with语句(将指定对象添加到作用域链中)

    没有块级作用域
    变量是被添加到当前的执行环境中的,
    使用var声明的变量会被自动添加到最近的环境中,在函数内部,最近的是函数的局部环境;with语句中,最接近的是函数环境,没有使用var初始化的,会自动添加到全局环境(不建议这样使用,严格模式下,初始化未经声明的变量会导致错误)。
    查询标识符
    标识符(变量名):查询时,先在局部环境中查找,没找到则继续向上搜索,一直到全局环境的变量对象,若还没找到,则是该变量尚未声明。若找到,则停止搜索,不在进入下一个变量对象。(局部环境有,则不使用父级的标识符)

  3. 垃圾回收
    • 标记清除
    • 引用计数(循环引用会有问题)手动断开
0 0
原创粉丝点击