JavaScript变量对象

JavaScript变量对象javascript

  1. 每个执行上下文,都有三个重要的属性
    • 变量对象
    • 做用域链
    • this
变量对象
  1. 变量对象是与执行上下文相关的数据做用域,存储了在执行上下文中定义的变量和函数声明
  2. 不一样执行上下文的变量对象稍有不一样
 
全局上下文
  1. 全局对象
    • 全局对象是预约义的对象,做为JavaScript的全局函数和全局属性的占位符。经过做用全局对象,能够访问全部其余预约义的对象,函数和属性。
    • 在顶层JavaScript代码中,可使用this关键词来引用全局对象。由于全局对象是做用域链的头,这意味着全部非限定性的变量和函数名都会做为该对象的属性来查询。
    • 例如,当JavaScript代码引用 parselnt()函数时,他引用的是全局对象的 parselnt 属性。全局对象是做用域链的头,还意味着在顶部JavaScript代码中声明的全部变量都将成为全局对象的属性。
  2. 能够经过this引用,在客户端JavaScript中,全局对象就是Window对象。
    console.log (this)

     

  3. 全局对象是有Object构造函数实例化的一个对象。java

    console.log (this instanceof Object)

     

  4. 预约义了一堆函数和属性
    console.log (this.Math.random())
    console.log (Math.random())

     

  5. 做为全局对象的宿主
    var nub = 1
    console.log (this.nub)

     

  6. 客户端JavaScript中,全局对象window属性指向自身
    var nub = 1 
    ​​console.log (window.nub)
    ​​​​​​​this.window.b =2
    
    console.log (this.b)

     

函数上下文
  1. 在函数上下文中,咱们用活动对象来表示变量对象
  2. 活动对象和变量对象实际上是一个东西,只是变量对象是规范上的或者说是引擎实现上的,不可在JavaScript环境中访问,只有当进入一个执行上下文中,这个执行上下文的变量对象才会被激活,而只有被激活的变量对象,也就是活动对象上的各类属性才能被访问。
  3. 活动对象是在进入函数上下文时被建立的,他经过函数的 arguments属性初始化。arguments属性值是Arguments 对象。
执行过程
  1. 执行上下文的代码会分红两个阶段进行处理:分析和执行,咱们也能够叫作:
    1. 进入执行上下文
    2. 代码执行
进入执行上下文
  1. 当进入执行上下文的时候,这时候代码尚未执行
  2. 变量对象包括
      1. 函数的全部行参(若是是函数上下文)
        • 由名称和对应值组成的一个变量对象的属性被建立
        • 没有实参,属性值设为 undefined
      2. 函数声明
        • 由名称和对应值(函数对象(function-object))组成一个变量对象的属性被建立
        • 若是变量对象已经存在相同名称的属性,则彻底替换这个属性
      3. 变量声明
        • 由名称和对应值(undefined)组成一个变量对象的属性被建立
        • 若是变量名称跟已经声明的形式参数或者函数相同,则变量声明不会干扰已经存在的这类属性
  3. 举个例子:
function foo(a){
 var b = 2
 function c(){}
 var d = function (){}
 b = 3
}
foo(1)

在进入执行上下文后,这时候的AO是:
AO = {
 arguments:{
  0:1 ,
  length:1
 },
 a:1,
 b:undefined,
 c:function (){},
 d:undefined
}

代码执行
在代码执行阶段,会顺序执行代码,根据代码,修改变量对象的值
当代码执行完毕,这时候的AO是:
AO = {
 arguments:{
  0:1 ,
  length:1
 },
 a:1,
 b:3,
 c:function (){},
 d:reference to FunctionExpression "d"
}

总结:
1.全局上下文的变量对象初始化是全局对象
2.函数上下文的变量对象初始化只包括Arguments对象
3.在进入执行上下文时会给变量对象添加形参,函数声明,变量声明等初始化的属性值
4.在代码执行阶段,会再次修改变量对象的属性值

思考题:dom

  1. 第一题:
function foo(){
 console.log(a)
 a = 1
}
foo()// a is not defined

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

第一段会报错:Uncaught ReferenceError: a is not defined。
第二段会打印1。

这是由于函数中的a并无经过 var 关键字声明,因此不会被放在AO中。
第一段执行console的时候,AO的值为:
AO = {
 arguments: {
  length:0
 }
}
没有a的值,就会到全局中去寻找,全局也没有,因此会报错
当第二段执行console的时候,全局对象已经被赋予了a属性,这时候全局就能找到a的值,因此会打印1

第二题:函数

console.log(foo)// [Function: foo]

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

首先会打印函数 而不是undefined。
这是由于在进入执行上下文时,首页会处理函数声明,其次会处理变量声明,若是变量名称跟已经声明的形参或者函数相同,则变量声明不会干扰已经存在的这类属性。
相关文章
相关标签/搜索