J30 作用域链

119 阅读2分钟

1.全局变量:在全局上下文EC(G)的全局变量对象VO(G)存储的变量

  • 1.1 在某一个上下文中创建函数,除了开辟堆内存和赋值之外,还多做了一件事情:给当前函数设置作用域链[scope]=当前函数创建时候所在的上下文

  • 1.2 执行函数的时候

    • 创建新的私有的上下文EC(存放私有变量的变量对象AO)
    • 进栈执行
    • 初始化作用域链 scopeChain:当前EC,函数[scope]
    • 初始化this指向
    • 形参变量赋值(包含初始化arguments)
    • 变量提升
    • 代码执行
    • 执行完可能会出栈(也可能不出栈)

2.私有变量:在函数执行形成的私有上下文EC(X)中的变量对象中的AO(X)存储的变量

  • 当前上下文中声明过的变量或者函数 都会存储到AO(X)中
  • 函数定义的形参变量,也会存储到当前上下文的AO(X)中

3.作用域链查找机制

在当前上下文中,代码执行的过程中遇到一个变量,首先看他是否为私有的

  • 如果是私有的,接下来的所有操作,都是操作自己的,和别人没有关系;

  • 如果不是私有的,则按照scopeChain作用域链进行查找,在那个上下文中找打,当前变量就是谁的。...一直找到全局上下文为止

  • 如果找到EC(G)都找不到:如果是获取变量值就会报错,如果是设置值,相当于给GO加属性

    console.log(a, b);//=>undefined var a = 12, b = 12;//=>13 function fn() { console.log(a, b);//=>undefined 12 var a = b = 13; //=>var a=12; b=12; 只有第一个带VAR,第二个不带VAR console.log(a, b);//=>13 } fn(); console.log(a, b);//=>12 13