js查缺补漏——函数、作用域和内存的那些事

一.变量分为基本类型和引用类型。

基本类型的变量指的是基本数据类型定义的值,是按值访问。
而引用类型不允许直接访问内存中的位置,所以操作的时候都是在操作对象的引用。

区别如下:

  • 可以动态的修改、添加、删除引用类型的属性,而对基本类型无法操作。
  • 基本类型是存在栈中,复制是创建一个新值,完全独立,两个变量可以参与任何操作互不影响。而引用类型的存在堆中,复制的两个变量都引用同一个对象,因此改变h对象的属性,两个变量都会受到影响。

二.传参需要注意的:【属于局部变量】

传递参数是按值访问,而上述的访问变量是有两种 按值和引用的两种方式。

三.检测数据类型的方法。

typeof 主要是用来检测基本数据类型,返回的是类型值 Number、Boolean、String等。
instanceof 用来检测是什么类型的对象,如果是基本数据类型会返回false。如果是检测引用类型是否属于Object则一定是true。【官方定义:检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。】

四.执行环境及其作用域。

执行环境:定义了变量或函数有权访问的其他数据,决定了它们各自的行为。每个执行环境都有一个变量对象,环境中定义的所有变量和函数都保存在这个对象中。

全局执行环境是最外围的一个执行环境,window对象。因此所有全局变量和函数都是基于window对象的属性和方法创建的。执行环境中的所有代码执行完毕后。该环境被销毁,保存在其中的所有变量和函数定义都随着销毁,全局环境是在关闭网页或浏览器才销毁。

容易搞混的几个概念:

  • 作用域:当前的执行上下文,在其中的值和表达式“可见”(可被访问)。如果一个变量或表达式不在当前的作用域中,那么它是不可用的。子作用域可以访问父作用域,反之不行。
    作用域分为以下几种:
    全局作用域:脚本模式运行所有代码的默认作用域
    模块作用域:模块模式中运行代码的作用域
    函数作用域:由函数创建的作用域
    块级作用域:用一对花括号(一个代码块)创建出来的作用域,注意块级作用域只对let const声明的变量有用,对var声明的变量无用。

  • 作用域链:当代码在一个环境中执行的时候,会创建变量对象的一个作用域链。【是保证对执行环境有权访问所有变量和函数有序访问。】

    首先当前执行环境的变量对象–>下一个包含环境–>下一个包含环境… 最后是全局执行环境的变量对象。

    通俗的说就是:在函数执行时,内部代码寻找标识符的方式。它从当前作用域开始,一直找到全局作用域。当在函数内部访问一个变量或函数时,JavaScript 引擎会先在当前函数的作用域中查找,如果找不到,就会沿着作用域链向上查找,直到找到为止。【子执行环境可以访问父执行环境。具有线性、有序、只能向上搜索的特点。】

    即:如果在局部变量对象中能找到,就停止搜索,否则继续向外层查找直到全局变量对象。

五.垃圾收集和内存。

JavaScript具有自动垃圾收集的机制,会按照固定的时间间隔周期性的去回收不需要的变量。

局部变量的生命周期:首先先分配给这个变量一个内存空间来存储值,当函数执行完不需要的时候就可以释放这个局部变量的内存,进行回收。这也是为什么全局变量更消耗内存的原因。

常用的收集方法有两种:

  1. 标记清除:通过标记进入环境、离开环境的这些标记,最后把无法访问的变量进行内存清除。
  2. 引用计数:跟踪记录每个值被引用的次数。这个值被引用到就加1,如果引用了另外的值则减1,当为0的时候就可以释放内存。

所以确保占用最少的内存可以获得更好的性能,所以在执行的代码中只保存必要的数据,当数据不再需要,可以通过解除引用的方法来减少内存的占用:将值设置为null。【通常是对全局变量进行手动解除引用,以便让值脱离执行环境,在下一次回收】。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值