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);