ES 262学习笔记:变量初始化
Time: 11-08-8 Comments: 0
前面的文章提到:当控制进入一个执行上下文时,会进行变量初始化。这篇文章来了解下变量初始化及其过程。。。
一. 什么是变量初始化
ES 262-3中,”10.1.3 Variable Instantiation”一节有相关描述:
每个执行上下文都有一个相关的变量对象,当进入一个执行上下文时,代码中的函数形参(对于函数代码而言),函数声明,变量声明会以属性的形式添加到变量对象上并赋初始值,这就是变量初始化。
二. 变量初始化的顺序
当进入一个执行上下文时,属性会按照”函数形参 – 函数声明 – 变量声明”的先后顺序,依次添加到变量对象上,详细情况如下:
1. 函数形参(对于函数代码而言)
(1)添加到变量对象时,其属性名为形参名,属性值为实参的值; (2)如果实参的数量少于形参,那么多出的形参,其属性值为undefined; (3)如果存在两个或者两个以上的同名形参,则只会创建一个属性,属性值为最后一个对应实参的值; 若最后一个实参未指定,则值为undefined。
// 以下例子,已在IE6~9,FF4+,Chrome 11+,Safari 5.0.3,Opera 11.01中测试通过
例_1:两个同名形参,对应的两个同名实参也已指定
function show(a,b,b) {alert(b);}
show(1,2,3); // 3
例_2:两个同名形参,缺少最后一个同名实参
function show(a,b,b) {alert(b);}
show(1,2); // undefined
2. 函数声明
(1)添加到变量对象时,其属性名为函数名,属性值为新创建的函数对象; (2)如果变量对象上已存在同名属性,那么该同名属性的值将被替换为函数对象;
// 以下例子,已在IE6~9,FF4+,Chrome 11+,Safari 5.0.3,Opera 11.01中测试通过
例_1:函数声明与函数形参同名
function show(a,b) {
function a() {}
alert(typeof a === 'function');
}
show(1,2); // true,属性a的值已被替换为函数对象
3. 变量声明
(1)添加到变量对象时,其属性名为变量名,属性值为undefined; (2)如果变量对象上已存在同名属性,则同名属性的值不会被改变。
// 以下例子,已在IE6~9,FF4+,Chrome 11+,Safari 5.0.3,Opera 11.01中测试通过
例_1:变量声明与函数形参同名
function show(a,b) {
var a;
alert(a);
}
show(1,2); // 1,而非undefined
例_2:变量声明与函数声明同名
function show(a,b) {
var a;
function a() {}
alert(typeof a === 'function');
}
show(1,2); // true,而非undefined
