美文网首页
变量对象的生成

变量对象的生成

作者: shandamengcheng | 来源:发表于2020-04-03 09:15 被阅读0次

执行上下文的生命周期分为两个阶段:创建阶段和代码执行阶段。
创建阶段:

  1. 生成变量对象
  2. 确定作用域链
  3. 确定this的指向

生成变量对象的过程如下:

  • 建立arguments对象:检查当前上下文中的参数(函数参数),建立该对象下的属性和属性值。
  • 函数中的所有形参加入到变量对象中。

函数参数名作为一个变量对象的一个属性被创建,值为对应传进来的值 ,否则为undefined.

  • 当前执行上下文中的函数声明的提升,函数名作为变量对象的一个属性被添加,值为函数的引用。如果变量对象中存在一个同名函数,则会对前一个函数进行覆盖。
  • 变量提升。以变量名为变量对象的一个属性被添加,值为undefined。如果变量对象中存在一个同名函数命,那么该变量名不会影响到函数名。(可以理解为:重名的变量名不会再被添加进变量对象了)

VO与AO

VO为变量对象,AO为活动对象,其实,他们是同一个对象的两种状态,就是说,在执行上下文的创建阶段会生成VO,在执行上下文的代码执行阶段,VO就变成了AO。

  • 函数表达式不包含在VO中
  • 没使用Var声明的变量不包含在VO中

在全局执行上下文中,变量对象就是全局对象。只有全局上下文的变量对象允许通过VO的属性名称间接访问;函数执行上下文中,VO是不能直接访问的,此时AO代替了VO,从而通过AO来访问。

有一点需要注意

不使用var声明的变量是一个全局变量,那么只有在通知了系统这是一个全局变量之后才能访问。

更具体地说,其实不使用var创建的变量,即下面的代码中的这种方式创建的,是相当于给全局对象global添加了一个属性。由于全局对象是共享的,因此只有在属性添加之后才可以访问,否则会报错。

function foo() {
    console.log(a);
    a = 1;
}

foo(); //Uncaught ReferenceError: a is not defined。

关于执行上下文中的非匿名立即执行函数

var foo = 1
(function foo() {
    foo = 10
    console.log(foo)
}()) 

这段代码的执行结果为:

ƒ foo() {
    foo = 10
    console.log(foo)
}

这个可以理解为:在()中创建了一个变量对象,里面有一个foo属性,执行一个函数,在函数内部可以访问到这个foo属性,但是这个foo是只读的,因此赋值改写被忽略,因此结果为foo这个函数。

关于let和var

JS引擎在扫描代码发现变量声明时,要么将他们提升至作用域顶部(遇到var声明),要么将他们放入TDZ(遇到let和const声明)。访问TDZ中的变量会触发运行时错误。只有执行过变量声明语句后,变量才会从TDZ中出来,然后才可以正常访问。

相关文章

  • 变量对象的生成

    执行上下文的生命周期分为两个阶段:创建阶段和代码执行阶段。创建阶段: 生成变量对象 确定作用域链 确定this的指...

  • JS基础小记

    变量对象与基础数据类型 JavaScript的执行上下文生成之后,会创建一个叫做变量对象的特殊对象,JavaScr...

  • struts2 向值栈中存放对象和List集合(第三种方式)

    一、向值栈中放对象 1、实现步骤 定义对象变量 生成变量的get方法 在执行的方法里头向对象设置值 2、代码 Us...

  • 往值栈中放对象、List集合

    向值栈放对象的步骤如下: 1、定义一个对象变量,比如User; 2、生成变量的get方法; 3、在执行的方法里面面...

  • 对象的可变性以及深浅拷贝

    一、对象的可变性 OC的类有可变的类和不可变的类,这与变量和常量是不同的。可变类生成的对象是可变对象,不可变类生成...

  • 一个 objc 对象如何进行内存布局(考虑有父类的情况)?

    1,所有父类的成员变量和自己的成员变量(实例变量、私有变量、以及声明为属性生成的变量)都会存放在该对象所对应的存储...

  • static与final使用陷阱

    Static修饰属性:无论一个类生成了多少个对象,所有这些对象共同使用唯一静态的成员变量;一个对象对该静态成员变量...

  • 《Java从小白到大牛》之第11章 对象

    《Java从小白到大牛》纸质版已经上架了!!! 类实例化可生成对象,实例方法就是对象方法,实例变量就是对象属性。一...

  • kotlin object

    object对象 object对象实现类似于java中的单例,内部生成了一个静态的INSTANCE的成员变量,并且...

  • string对象(ES5)

    String对象是JavaScript原生提供的三个包装对象之一,用来生成字符串的包装对象。 上面代码中,变量s1...

网友评论

      本文标题:变量对象的生成

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