问题:web
声明函数和变量发生了什么细节?函数
解析器如何而且在什么地方查找这些声明的函数和变量?this
引用这些对象会发生什么?spa
知识点:对象
变量对象(Variable Object - VO)是执行上下文的一个属性(property、特殊对象):生命周期
存储着在上下文中函数的形参、函数声明(FunctionDeclaration - FD)和声明的变量(var,变量声明);字符串
在具体执行上下文中,VO名称是不同的,初始结构也不同;it
有全局上下文变量对象(GlobalContextVO)和函数上下文变量对象(FunctionContextVO)之分。io
---全局上下文中的变量对象function
全局对象(Global object)是在进入任何执行上下文以前就已经建立的对象,该对象只存在一份,它的属性在程序中任何地方访问,全局对象的生命周期终止于程序退出那一刻。
在DOM中,全局对象的window属性引用了全局对象自身,当访问全局对象的属性时一般会忽略前缀,由于全局对象事不能经过名字直接访问的(如Math,String,Date等~),不过能够经过全局上下文的this来访问全局对象,而在window中,变量对象就是全局对象即VO(globalContext)=== global。
---函数上下文中的变量对象
活动对象(activation object - AO)在函数执行上下文中,VO是不可能直接访问的,此时由活动对象AO扮演VO的角色;经过函数的arguments属性(值为Arguments对象)初始化。
Arguments对象包括:
callee(指向当前函数的引用);
length(真正传递的参数个数);
properties-indexes(字符串类型的整数)属性的值就是函数的参数值(按参数列表从左到右排列)。properties-indexes内部元素的个数等于Arguments.length.properties-indexes的值,和实际传递进来的参数之间是共享的。
-------------
处理代码分两个阶段:
未执行代码以前,进入执行上下文建立相关意见声明的属性;
执行代码。
---进入执行上下文
函数的全部形参(若是此时在函数执行上下文中):按名称和对应值的形式建立变量对象的属性,若是没有传递对应参数,则值为undefined ;
全部函数声明(FunctionDeclaration, FD):按名称和对应值(函数对象function-object)的形式建立变量对象的属性,若是已经存在相同名字的变量(变量没赋值),代之;
全部变量声明(var, VariableDeclaration):按名称和对应值(undefined)的形式建立变量对象的属性,若是已经存在相同名字(形参或者函数)的属性,不代之 。
---代码执行
在代码执行前,VO/AO已经拥有了属性,但大部分属性仍是系统默认的初始值undefined;
代码执行时,会相应的填充VO/AO中相应属性的值来计算结果。
-------------
关于变量
任什么时候候只有经过var才能声明的变量,根据VO的相关要点,未经过var声明的变量在执行代码以前不会被包含到VO中;
经过var才能声明的变量不能被delete。
---函数中,形参与变量
若是函数内部声明的变量与形参同名,但变量未赋值,则变量形参同值;
若是函数内部声明的变量已经赋值了,形参没法改变其值;
arguments能够获取到形参的值。