美文网首页
JS中的变量对象

JS中的变量对象

作者: js好难学啊 | 来源:发表于2018-12-10 23:09 被阅读0次

变量对象

关键字

变量对象(variable object), 活动对象(activation object), 执行上下文

变量对象(variable object)

作用:

每个执行上下文都有一个与之关联的变量对象, 执行上下文中定义的所有变量和函数都保存在这个对象中, 我们无法编码无法访问这个对象,但是解析器会在后台处理它。

执行上下文一章中我们提到一个执行上下文必定包括:变量对象,作用域链,this对象, 执行上下文又分三种全局上下文函数上下文eval上下文

全局上下文

一句话:在全局上下文中的变量对象就是宿主环境的全局对象
宿主环境?说的简单点儿就是:浏览器或者nodejs等
浏览器中全局对象就是window对象。可以按下F12输入this验证。在nodejs中全局对象就是global。

函数上下文

说起函数上下文就不得不先说到活动对象

活动对象(activation object)

活动对象在最开始时只包含一个变量, 那就是arguments对象(此对象在全局上下文中是不存在的)。 如果当前上下文时函数上下文,那就将活动对象转变尾变量对象。

活动对象与变量对象的区别

未进入执行阶段之前,变量对象(VO)中的属性都不能访问!但是进入执行阶段之后,变量对象(VO)转变为了活动对象(AO),里面的属性都能被访问了,然后开始进行执行阶段的操作。它们其实都是同一个对象,只是处于执行上下文的不同生命周期。

执行上下文创建阶段中的变量对象

既然执行上下文包括了三个属性,那肯定要确定自己的属性包括了哪些东西吧。本文先看看变量对象属性。
此时并没有执行代码,只是进入了执行上下文。
变量对象包含了:

  1. 函数的所有形参
    • 由参数名及起对应值组成一个变量对象的属性被创建
    • 如果没有实参,则值为undefined
  2. 函数的声明
    • 由函数称和对应值(函数对象(function-object))组成一个变量对象的属性被创建
    • 如果已经存在相同名称的属性,则完全替换这个属性
  3. 变量的声明
    • 由名称和对应值(undefined)组成一个变量对象的属性被创建
    • 如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的这类属性。

举个例子

function foo(a) {
  var b = 'b',
  var c = function () {console.log(c)}
  function d() {console.log('d')}
}

foo('a')

创建阶段

此时的VO(变量对象)是:

VO: {
    arguments: {
      0: 'a',
      length: 1
    },
    b: undefined
    c: undefined
    d: -> function d() {console.log('d')}
}

执行阶段

代码从上至下顺序执行, VO中的属性逐渐被赋值
此阶段为

VO: {
    arguments: {
      0: 'a',
      length: 1
    },
    b: 'b'
    c: -> function () {console.log('c')}
    d: -> function d() {console.log('d')}
}

其实这也从变量对象的角度出发理解了javascript中的函数提升以及变量提升。

console.log(foo) // 会打印函数foo

function foo() {}

var foo = 1

这个例子中因为函数提升以及变量提升的原因其实正确的执行步骤应该如下:

function foo() {} // 函数提升
// var foo = undefined // 变量提升
// 注释掉的原因是因为名称
// 相同,根据变量声明的规则,若变量名与形参名
// 或函数名重复时,并不会干扰或覆盖。

console.log(foo) 
foo = 1

在函数执行上下文的创建阶段

VO: {
  arguments: {
    length: 0
  },
  foo: -> function foo() {}
}

进入执行阶段后会根据代码依次赋值。这就是js中函数提升变量提升产生的原因。

相关文章

  • JS中的变量对象

    函数参数传递的过程实际上就是实参像形参复制值的过程。 在向参数传递基本类型的值时,被传递(实参)的值会复制给一个局...

  • JS中的变量对象

    变量对象 关键字 变量对象(variable object), 活动对象(activation object), ...

  • js内存泄漏常见的四种情况

    意外的全局变量 js中如果不用 var 声明变量,该变量将被视为 window 对象(全局对象)的属性,也就是全局...

  • react 对象动态添加属性 setState

    // js 对象动态添加 js对象动态添加 //总结,给对象动态添加变量属性的方法如下: //obj[变量]=变...

  • JS中的变量和对象

    1、JavaScript中的所有变量都是对象,这一点一定要明确 2、JavaScript中的总共有如下几种数据对象...

  • JavaScript中的this

    JS中的this指的是什么? JS中的this的含义非常多,可以是全局变量,当前对象,或者任意对象,这取决于函数的...

  • js程序高级设计

    1.JSON对象 json对象与js对象字面量的区别没有变量声明,在json中没有变量的概念没有末尾的分号json...

  • 预编译阶段变量函数的提升 和 多个函数的执行顺序

    下面这道题讲解变量和函数的提升 预编译js的变量对象 AO对象 让js引擎去访问1、创建AO对象2、找形参和变量的...

  • Js执行环境、作用域及上下文的简单理解

    JS中,每个执行环境都有一个与之关联的变量对象。环境中定义的所有变量和函数都保存在这个对象中。 每个函...

  • js中的数组

    1.关于js中的array对象 Array对象是用于在单个的变量中存储多个值; js数组中的每一项在都能保存任何类...

网友评论

      本文标题:JS中的变量对象

      本文链接:https://www.haomeiwen.com/subject/dyzdhqtx.html