js的解析机制:遇到script标签的话js就进行预解析,将变量var和function声明提升,但不会执行function,然后就进入上下文执行,上下文执行还是执行预解析同样操作,知道没有var和function,就开始执行上下文。
JavaScript中,函数及变量的声明将被提升到函数的最顶部。
1.变量提升
变量提升只提升变量名
var x = 5; // 初始化 x
elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x + " " + y; // 显示 x 和 y
var y = 7; // 初始化 y
上例类似如下:
var x = 5; // 初始化 x
var y; // 声明 y
elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x + " " + y; // 显示 x 和 y
y = 7; // 设置 y 为 7
y输出了undefined,因为js只有声明的变量会提升,初始化的不会。上例自动提升变量y的声明,但不会提升y的赋值。
2.函数提升
函数声明提升直接将整个函数提到最顶端。且函数声明的优先级比变量声明高。
js创建函数有两种方式:
- 函数表达式 var foo = function foo ( ) { }
- 函数声明方式 function foo ( ) { }
console.log(a) // f a() { console.log(a) }
console.log(b) //undefined
function a() {
console.log(a)
}
var b = function(){
console.log(b)
}
注意:只有函数声明形式才存在提升。
console.log(a); // f a() {console.log(10)}
console.log(a()); // undefined
var a = 3;
function a() {
console.log(10) //10
}
console.log(a) //3
a = 6;
console.log(a()); //a is not a function;
由此可见函数提升要比变量提升的优先级要高一些,且不会被变量声明覆盖,但是会被变量赋值之后覆盖。