谈一谈 JS 变量对象

谈一谈 JS 变量对象

什么是变量对象:

  1. 在函数执行之后,产生了执行上下文,在执行上下文中要生成一个变量对象,保存当前作用域中所有的变量,只有激活了变量对象,当前作用域的变量才能被访问。
  2. 变量对象保存了当前作用域中声明的变量、函数、形参、arguments。

变量对象的分类:

  1. 全局变量对象:
    因为全局的变量和函数都是 window 对象的属性和方法,所以window对象就是全局变量对象。

  2. 局部变量对象:

    1. 变量对象首先要包含所有的 形参 和 实参。
    2. 在变量对象中添加当前作用域的所有的函数声明,以键值对形式表示,如果变量对象中有同名,则直接覆盖。
    3. 在变量对象中添加所有的变量声明,键值对表示,如果变量和形参或函数同名,则不干扰当前已经存在的属性。

谈一谈作用域链

  1. 函数在创建的时候就会创建一个包含全局变量对象的作用域链(scope chain)。
  2. 作用域链是:保证对 执行环境有权访问的所有变量和函数 的有序访问。
  3. 作用域链在函数定义的时候已经生成,但是并不完整。当函数执行的时候,会把自己的变量对象推到作用域链的最前端,以构成完整的作用域链。
  4. 作用域链的最前端一定是当前执行环境的变量对象,末端一定都是全局的变量对象。
  5. 搜索标识符的过程是从作用域链的最前端向最末端逐级搜索的过程,如果搜索不到可能会报错。

谈一谈闭包

什么是闭包:

理解一:函数嵌套函数,闭包就是内部嵌套的函数。
理解二:闭包就是包含被引用变量的 closure对象,在嵌套的内部函数中。

产生闭包的情况:

  1. 函数嵌套。
  2. 内部函数引用外部函数的变量。
  3. 调用外部函数。

闭包的作用:

  1. 延长了局部变量的生命周期。
  2. 可以在外部操作局部变量。

闭包的缺点:

  1. 函数的局部变量占用内存时间过长,容易造成内存泄漏。
  2. 解决:
    1. 减少使用闭包。
    2. 及时释放闭包。

解释名词:公有、私有、静态、特权

公有属性和方法:
设置给实例化对象的属性和方法。

私有属性和方法:
在构造函数中声明的变量和方法。

静态方法和静态属性:
直接把构造函数当做对象扩展的属性和方法,无需实例化即可访问。

特权方法:
在构造函数中设置给实例化对象的方法。

猜你喜欢

转载自blog.csdn.net/weixin_47021982/article/details/113998002