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;

由此可见函数提升要比变量提升的优先级要高一些,且不会被变量声明覆盖,但是会被变量赋值之后覆盖。