JavaScript作用域链

起步

在Js中没有严格意义上区分栈内存与堆内存,我们可以简单理解为Js的所有数据都保存在堆内存中,在Js中引用类型是按引用访问,而基本类型则相互独立不影响,比如:

var a=10;
var b=a;
b=20;//此时a还是10,相互不影响

var n={'a':10,b:'20'}
var m=n;
m.a=30;//此时n.a是30

 

JS的作用域

作用域,官方的解释是:在电脑程序设计中,作用域是名字与实体的绑定保持有效的那部分计算机程序

简单地说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在Javascript中,变量的作用域有全局作用域和局部作用域两种,局部作用域又称为函数作用域

⚠️:

1.在函数内部,不用var声明的变量,处于全局作用域

2.变量不能删除,属性可以删除

var a=10;
alert(window.a)//10
alert(delete a)//fasle
b=10;
alert(window.b)//10
alert(delete b)//true

但是,如果在eval的上下文中,变量是可以删除的:

eval('var a=20;');
alert(window.a);//20
alert(delete a);//true
alert(window.a);//undifined

 那么,函数的声明周期又是什么?

函数的生命周期分为创建和执行两个阶段,函数创建阶段,JS解析引擎进行预解析,会将函数声明提前,同时将该函数放到全局作用域中或者当前函数的上一级函数的局部作用域中。

在函数执行阶段,JS引擎会将当前函数的局部变量和内部函数进行声明提前,然后再执行代码,当函数执行退出时,会释放该函数的执行上下文,并注销该函数的局部变量。

什么是AO、VO

VO对应的是函数创建阶段,JS解析引擎进行预解析时,所有的变量和函数的声明,统称为Variable Object。该变量与执行上下文相关,知道自己的数据存储在哪里,并且知道如何访问。VO是一个与执行上下文相关的特殊对象,它存储着在上下文中声明的以下内容:

  • 变量 (var, 变量声明);
  • 函数声明 (FunctionDeclaration, 缩写为FD);
  • 函数的形参

AO对应的是函数执行阶段,当函数被调用执行时,会建立一个执行上下文,该执行上下文包含了函数所需的所有变量,该变量共同组成了一个新的对象就是Activetion Object。该对象包含了:

  • 函数的所有局部变量
  • 函数的所有命名参数
  • 函数的参数集合
  • 函数的this指向

作用域链是什么?

 当代码在一个环境中执行时,会创建变量对象的一个作用域链来保证堆执行环境有权访问的变量和函数的有序访问。作用域第一个对象始终是当前执行代码所在环境的变量对象

 函数在一个环境中创建时,会先创建一个vo,当他被执行时会创建一个ao

即调用一个函数时,其作用域链时ao->vo

posted on 2019-02-16 22:31  袁233  阅读(124)  评论(0编辑  收藏  举报

导航