ES 262学习笔记:变量初始化

前面的文章提到:当控制进入一个执行上下文时,会进行变量初始化。这篇文章来了解下变量初始化及其过程。。。

一. 什么是变量初始化

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

三. 参考资料

1. ecmascript 262-3(pdf)

Leave a comment!