一:Js解析机制
遇到 script 标签的话 js 就进行预解析,将变量 var 和 function 声明提升,但不会执行 function,然后就进入上下文执行,上下文执行还是执行预解析同样操作,直到没有 var 和 function,就开始执行上下文。
二:
函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部。
三:函数声明提升
a=5;
show();
var a;
function show(){};
预解析:
function show(){}; // 函数的声明
var a; // 变量的声明
a=5;
show();
注意:需要注意都是函数声明提升直接把整个函数提到执行环境的最顶端。
除了以上的函数声明方式外,还可以使用匿名函数的方式。使用匿名函数的方式不存在函数提升,因为函数名称使用变量表示的,只存在变量提升。
var getName=function(){
console.log(2);
}
function getName(){
console.log(1);
}
getName();// 2
预解析:
//函数、变量声明提升后
function getName(){ //函数声明提升到顶部
console.log(1);
}
var getName; //变量声明提升
getName = function(){ //变量赋值依然保留在原来的位置
console.log(2);
}
getName(); // 最终输出:2
四:变量提升:
x=5;
elem=document.getElementById("demo");
elem.innerHTML=x; // 使用后声明
var x;
// 预解析:
var x;
x=5;
elem=document.getElementById("demo");
elem.innerHTML=x;
----------------------------------------------------------------------------
var a=7;
console.log("++++++++++a",a)
console.log("++++++++++b",b) // undefined;因为只是 变量声明提升,初始化没有提升
var b=7;
// 预解析:
var a=7;
var b;
console.log("++++++++++a",a)
console.log("++++++++++b",b) // undefined(声明无初始化);因为只是 变量声明提升,初始化没有提升
b=7;