当前位置: 首页 > 科技观察

前端100题——通俗易懂的变量对象

时间:2023-03-20 11:28:15 科技观察

变量对象是与执行上下文相关的特殊对象,存放的是上下文中声明的内容。根据执行上下文,可以分为全局上下文中的变量对象和函数上下文中的对象。全局上下文中的变量对象全局对象在进入全局执行上下文之前已经被创建。这个对象只有一个副本,它的属性在程序的任何地方都可以被访问到,它的生命周期在程序退出时结束。例如全局定义的变量,如Math和Date,都属于全局上下文中的变量对象。函数上下文中的变量对象存在于与执行上下文相关的函数执行上下文中:形式参数、函数声明、变量,它们是函数中的变量对象。(下面会重点介绍函数中的变量对象)在《百题-执行上下文》中描述了执行上下文分为创建阶段和代码执行阶段,在这两个阶段会完成变量的创建在创建阶段;它会在代码执行阶段完成变量赋值。下面从这两个阶段来描述这个过程。functiontest(x,y,z){console.log(arguments);console.log(childFun());console.log(val1);varval1=10;console.log(val1);functionchildFun(){return'childFun';}console.log(childFun());}11.1创建阶段在创建变量对象时,分别完成以下步骤:创建arguments对象arguments是一个类数组对象,对应于传递给函数的参数。在变量对象创建阶段,首先检查当前上下文中的参数,建立对象下的属性和属性值。创建参数后的结果如下:[Arguments]{'0':x,'1':y,'2':z}查看函数函数声明创建属性创建属性中的函数名变量对象,属性值是对函数所在内存地址的引用。如果函数名称的属性已经存在,则该属性将被新引用覆盖。检查变量声明创建属性对于var声明的变量,每找到一个,就在变量对象中创建一个属性,属性值为undefined。如果变量名的属性已经存在,为了防止同名函数被修改为undefined,会直接跳过,不会修改原来的属性值。let和const声明的变量只会创建一个属性,不会对齐赋值,所以不能使用。11.2执行阶段在进入执行阶段之前,变量对象中的属性是不可访问的,但是进入执行阶段之后,变量对象(VO)转化为活动对象(AO),可以访问里面的属性,然后开始执行阶段操作。(变量对象和活动对象其实是同一个对象,只是处于不同的执行上下文生命周期)先看整个代码的执行结果functiontest1(x,y,z){console.log(arguments);//[参数]{'0':1,'1':2,'2':3}console.log(childFun());//childFunconsole.log(val1);//undefinedvarval1=10;console.log(val1);//10functionchildFun(){return'childFun';}console.log(childFun());//childFun}test1(1,2,3);上面的arguments接收到传入的参数并完成相应的properties赋值过程,并验证了arguments参数的结构;可以在两个位置调用childFun函数,输出正确的执行结果,证明该函数在创建阶段已经被提升并完成了相应的赋值;val1变量可以在初始化调用前进行初始化,证明在其创建阶段已经完成了变量提升,但其值只是被赋值为undefined,执行相应语句时赋值正确。本文转载自微信公众号“牵着风筝”,可通过以下二维码关注。转载本文请联系风筝持有人公众号。