知识点var 声明的变量在预解析的时候只执行声明,不会执行定义,默认值是 undefined。function 声明的函数在预解析的时候会提前声明并且会同时定义。变量名重复声明无效预解析过得代码不会再执行阶段执行示例一console.log(a); // 打印函数a函数体(function a() { console.log(‘a’) })var a = 10;console.log(a); // 10function a() { console.log(‘a’) }console.log(a); // 10预解析过程首先预解析到有变量 a 存在,因此记录下 a 这个名字,和其值 undefined接着预解析到有函数 a 声明,记录下函数名 a但是发现已经记录了一个 a ,因此该操作无效,将函数体与 a 这个名字相关联解析完毕预解析过程代码a = undefineda = function () { console.log(‘a’) }预解析结果a = function () { console.log(‘a’) }执行过程打印变量 a 的值 function a() { console.log(‘a’) }变量 a 赋值为10,将原来关联的函数覆盖打印变量 a 的值 10打印变量 a 的值 10执行完毕执行过程代码console.log(a)a = 10console.log(a)console.log(a)示例二console.log(fn) // 函数fn函数体(function fn() { console.log(2) })function fn() { console.log(1) }console.log(fn) // 函数fn函数体(function fn() { console.log(2) })var fn = 10 console.log(fn) // 10function fn() { console.log(2) } console.log(fn) // 10预解析过程首先预解析到有函数 fn 声明,因此记录 fn 这个名字,并关联其函数体接着预解析到变量 fn 声明,记录下变量名 fn但是发现已经记录了一个 fn ,因此该操作无效接着预解析到有函数 fn 声明,因此记录 fn 这个名字但是发现已经记录了一个 fn ,因此该操作无效,接着关联其函数体解析完毕预解析过程代码fn = function () { console.log(1) }fn = function () { console.log(2) }预解析结果fn = function () { console.log(2) }执行过程打印变量 fn 的值 function fn() { console.log(2) }打印变量 fn 的值 function fn() { console.log(2) }变量 fn 赋值为10,将原来关联的函数覆盖打印变量 fn 的值 10打印变量 fn 的值 10执行完毕执行过程代码console.log(fn)console.log(fn)fn = 10console.log(fn)console.log(fn)