JavaScript中变量名重名

今天看到园子里的一篇文章,进的是变量名的重名问题,我们直接来看代码:

var a;
function a() { 
}
alert(typeof a);

这里alert的结果是function。但如果我将代码改一行,声明之后立即assign a value:

var a=1;        // 注意变化,声明后立即赋值
function a() {
}
alert(typeof a);

这时输出的却是number,为什么?博主的解释并不在理,他的意思是var a=1;被解释成:var a; a=1。解释没错,但没能解释为什么第二个代码输出是number。

我们还可以将代码再变化一下:

var a=1; 
a = function () {   //注意变化
}
alert(typeof a);

经过思考,我的理解是:function foo(){}这种形式的函数声明是在词法解析(lexical analysis)时就可以确定的,也就是说跟var a;类似这种变量及定义都可以在词法解析时确定。换个说法就是这些都是静态可以确定的。

而JavaScript是动态语言,他的变量只是一个引用而已,可以在运行时(runtime)指向任何类型实体。所以变量的类型也是运行时变化的,我们可以通过例子看一下:

var a=1; 
console.log(typeof a);

a = function() { 
}
console.log(typeof a);

a = "";
console.log(typeof a);
@ 2012-03-01 08:00

Comments:

Sharing your thoughts: