在js中 变量声明与赋值被认为是两个不一样的操做,引擎首先会对前者进行优先编译,这部分工做就是找到全部的声明(例如函数声明function b(注:非函数表达式),变量声明var a),既然是优先执行,那么在一些代码结构中,后声明的function,var 变量就会提早解释;函数
例如 var a=3;引擎会认为这是两个操做 var a(声明); a=3(赋值),简而言之就是 先有蛋 后有鸡,io
理解了这一点 这就很好解释以下的代码结构及其输出console
a=2;
var a; //定义声明提高
console.log(a) //获得2编译
-------------------分割线-------------------function
console.log( a );//获得undefined
var a = 2; //等效于var a;//定义声明置顶 a=2;变量
-------------------分割线-------------------co
foo(); //获得666工作
function(){分割
console.log(666)函数表达式
}
-------------------分割线-------------------
foo(); //报错 信息为 Uncaught TypeError: foo is not a function,由于此时 foo为undefined,而不是一个函数
var foo = function(){
console.log(6666)
}