看下面的代码:
v_name = "global";
function fn() {
alert(v_name );
var v_name = "local";
alert(v_name );
}
fn();
执行结果:第一个弹框为:undefined,第二个弹框为:local。
原因是:
按代码处理原则(两个阶段)。
第一个阶段:变量声明,函数声明,正常格式的参数创建,这是一个解析和进入上下文的阶段。
第二个阶段:代码执行。函数表达式和不合格的标识符(为声明的变量)被创建。
在fn()函数作用域里面已经声明了v_name变量。那么第一个alert(v_name)中的v_name,就不在取得全局变量的值,而是一个函数的局部变量了。这时v_name还没有赋值,所以第一个弹框为undefined,然后变量被赋值,于是第二个弹框为”local”。
另:javascript中,在函数任意位置声明多个var变量,其实它们都好像是在函数顶部声明了一样发挥作用,这种行为称为:hoisting(悬置/置顶解析/预解析)。