JavaScript脚本在正式执行前会对全局进行一次预处理,将所有var声明的变量进行一次赋值,赋值为undefined,同时将函数进行声明,写入Lexical Environment(词法环境)而没有用var声明的变量不会在预处理中处理,只有在执行时会定义为全局变量并进行赋值
console.log(a);//Output undefined
console.log(b);//Output ƒ b(){console.log("bbb");}
console.log(c);//报错!!! c is not defined
var a=1;
function b(){
console.log("bbb");
}
c=2;
注意函数定义方式:function xx(){} 为正常函数声明,而var xx=function(){}为函数表达式形式 看作先定义一个变量再对其进行赋值,所以在预处理结束后他的值应为undefined。
console.log(a);//Output ƒ a(){console.log("aaa");}
console.log(b);//Output undefined
function a(){
console.log("aaa");
}
var b=function(){
console.log("bbb");
}
如果出现定义出现重名时,JavaScript的预处理规则:
处理函数声明有冲突,会覆盖
处理变量声明时有冲突,会忽略
console.log(a);//Output ƒ a(){console.log("a");}
var a=1;
function a(){
console.log("a");
}
console.log(a);//Output ƒ a(){console.log("a");}
function a(){
console.log("a");
}
var a=1;
总结
console.log(a);//Output undefined
console.log(b);//报错!!! b is not defined
console.log(f);//Output ƒ f(){console.log("f");}
console.log(g);//Output undefined
var a = 5;
b=6;
console.log(b);//Output 6
function f(){
console.log("f");
}
var g = function(){
console.log("g");
}
console.log(g);//Output ƒ g(){console.log("g");}