JS之变量对象

158 阅读1分钟

感谢讶羽大大的分享,想看原文移步讶羽大大的GitHub

变量对象Variable Object

全局对象

在客户端JavaScript中的全局对象就是window对象。

而在全局上下文中声明的变量,可以作为window对象的一个属性。

var a = 1;
console.log(this.a);//1

window对象有一个window属性指向自己。

var a = 1;
console.log(window.a);

this.window.b = 2;
console.log(this.b);

函数上下文中的VO

当进入了函数上下文后,VO就变成了AO。

其实二者是一个东西,只是在存在在函数的不同的生命周期。

当函数执行的时候,可以分成两个阶段:

分析阶段

这个时候还没有开始执行代码。

此时的函数的VO包括:arguments对象、函数声明、变量声明(按顺序来的)。

举个🌰:

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: reference to function c(){},
    d: undefined
}

代码执行阶段

此时的AO是:

AO = {
    arguments: {
        0: 1,
        length: 1
    },
    a: 1,
    b: 3,
    c: reference to function c(){},
    d: reference to FunctionExpression "d"
}

思考题

分析就从上面两个阶段来:

console.log(foo);

function foo(){
    console.log("foo");
}

var foo = 1;
  1. 就在全局上下文中
  2. 既然不是函数上下文就没有arguments
  3. 开始分析阶段:
    • 有个函数function foo
    • 有个变量foo,但是已经有了同名函数foo,变量影响不了函数
  4. 执行代码阶段:
    • 执行console.log
    • 执行foo
    • 去外面找foo
    • 找到的是foo函数
    • 所以打印foo函数