在讲述预编译概念之前,先拿出一道习题,看看能不能准确地知道每一个alert会弹出什么内容。
alert(a);
var a = 3;
alert(a);
var a = function(){
alert(1);
}
a();
function a(){
alert(2);
}
alert(a);
那么问题来了,这些alert依次会在页面中弹出什么内容呢?是不是乍一看有点晕。在给出得出正确答案之前,先说下js的预解析规则。
js的预解析规则:当js执行一段代码时,会先进行预编译。
1. var解析:当js读到var时,会把var及其名字,提升到(script或整个函数)的最前边;
2. function预解析:当js解析到function的时候,会把function的整体内容,都提升到(script或整个函数)的最前边,跟在var之后;
3. 只有在把var和function预解析后,才会一行一行往下解析。
根据上述,我们可以对这道题目进行改写,如下所示:
var a;
var a;
function a(){
alert(2);
}
alert(a);
a = 3;
alert(a);
a = function(){
alert(1);
};
a();
alert(a);
现在是不是就能很清楚的看出,alert会弹出哪些内容了。依次为:1. function a(){ alert(2);};2. 3;3. 1;4.function(){alert(1)}。