面向对象day3

函数原型链

Function的介绍

  • 创建函数的方式
    • 声明式
    • 表达式
    • 构造函数
  • 由于函数也可以通过Function构造函数来创建,那么函数也是对象;具有proto属性

相关结论

  • 所有的函数都是Function实例。
  • 所有的函数的构造函数都是Function;
  • 所有的函数的原型对象为Function.prototype.

将函数称为函数对象,其他对象称为普通对象

arguments对象属性

  • length 实参的个数
  • callee 返回正在执行的函数;应用在匿名函数递归调用

函数相关属性

  • caller 返回调用当前函数的函数
  • length 形参的个数
  • name 存储函数的名字

模拟函数重载

  • 在js中,没有函数重载,只能通过arguments对象进行模拟

词法作用域

  • 规定变量的作用域是由变量声明的位置决定,而不是由使用变量的位置决定。
  • 在词法作用域中,只有函数可以分割作用域。与外界隔离。
  • 在函数内部可以访问函数外部的数据;但是函数外部无法访问内部的数据。

变量名(函数名)提升

  • 在js预解析阶段执行的操作
  • js本身是边解析边执行的

预解析

  • 首先,分析代码语法,如果有语法错误,就直接抛出异常。
  • 其次,将变量名以及函数声明提升到当前作用域最顶端。

in 运算符

  • 规则:前面的属性名字,要用字符串来表示;如果为变量,那么会将变量的值隐式转换成字符串,然后去判断变量的值是否为指定对象的属性(可以为继承过来的属性)。
  • 注意:后面的参数必须为对象;否则报错。

instanceof运算规则:

如果运算符后面的函数的prototype属性所引用的对象,出现在运算符前面的对象的原型链上的话,就返回true;否则就返回false。

绘制作用域链的规则

  • 将整个script标签的全局作用域,定义为0级作用域链。将全局作用域上的数据(变量、函数、对象等)绘制在该链上。
  • 由于在词法作用域中,只有函数可以分割作用域。因此,只要遇到函数,就要引申出新的作用域链,级别为当前链的级别+1;
  • 重复第二步骤,直到没有遇到函数为止。

变量的搜素原则:当访问一个变量时,

  • 首先在当前变量所处作用域链上查找,如果找到就直接使用,并停止查找
  • 如果没有找到,就向上一级链(T-1)上去查找。如果找到就直接使用,并停止查找;
  • 如果没有找到,就继续向上一级链查找。直到0级链,如果找到就直接使用,并停止查找。
  • 如果没有找到就报错。
  • 注意:

    • 如果访问的变量不存在,会搜索整个作用域链(不仅性能低,而且抛出异常)
    • 在实际开发中,不推崇所有数据都写在全局上,尽量使用局部变量,推荐使用沙箱。
    • 同级别的链上的变量相互之间不会干扰

      函数的执行环境

  • 在函数执行的时候,会创建一个执行的环境,包括aciveObject(活动对象)以及作用域链。

  • activeObject: 存储的是所有在函数内部定义的变量,以及函数的形参;
    会将变量名字以及形参名字作为该对象的属性来存储
    

闭包

  • 概念:一个函数有权去访问另一个函数的内部数据。
  • 缺点: 会造成函数内部的数据常驻内存,从而引发内存泄漏的问题。
  • 解决的问题:解决在函数外部无法访问函数内部的数据。
  • 为了防止闭包导致内存泄漏,在使用完闭包后,将其赋值为null即可。
  • 闭包怎么缓存数据?因为在函数内部有方法(函数)对其有引用,并且又将其返回到外部作用域上的一个变量接收。

垃圾回收机制 GC(Garbage Collection)

  • 引用计数
    如果一个变量被另一个变量引用,那么该变量的应用计数+1;当这个变量不再引用该变量(该变量被回收掉了)时,
    此时这个变量的引用计数 - 1;
    GC会在一定时间间隔去查看每个变量的计数,如果为0, 就将其占用的内存回收。
    
    缺点: 循环引用:会造成无法回收变量的内存
    a{ val : b} , b{val:a} b = null;(a = null)
    
  • 标记清除
    从当前文档根部(window对象)找一条路径,如果能到达该变量,那么说明此变量不应该 被回收掉
    反之,应该被回收其所占用的内存。
    --如果变量进入某个执行环境,那么给其标记为 “进入环境”;
    --如果上述执行环境执行完成,被销毁,那么该环境内的所有变量都被标记为“已出环境”
    --如果变量被标记为已出环境,就会被回收掉其占用的内存空间。
    
文章目录
  1. 1. 函数原型链
    1. 1.1. Function的介绍
    2. 1.2. 相关结论
    3. 1.3. 将函数称为函数对象,其他对象称为普通对象
    4. 1.4. arguments对象属性
    5. 1.5. 函数相关属性
    6. 1.6. 模拟函数重载
    7. 1.7. 词法作用域
    8. 1.8. 变量名(函数名)提升
    9. 1.9. 预解析
    10. 1.10. in 运算符
    11. 1.11. instanceof运算规则:
    12. 1.12. 绘制作用域链的规则
    13. 1.13. 变量的搜素原则:当访问一个变量时,
    14. 1.14. 函数的执行环境
    15. 1.15. 闭包
    16. 1.16. 垃圾回收机制 GC(Garbage Collection)
|