1.变量与函数
在js中声明一个变量有let const var三种方式,函数有声明函数和函数表达式两种。
2.预编译阶段做的事情
在预编译阶段,所有的var声明的变量会被初始化为undefined,所有的声明函数会用它的定义进行初始化,
而const let声明的变量则不会在预编译阶段执行初始化,函数表达式也属于变量的一种,因此如果使用var进行声明,则也会被初始化为undefined。如果在赋值之前调用函数表达式,则会报一个语法错误 Uncaught TypeError: say is not a function,因为此时这个变量的值还是undefined。如果使用const 或 let声明一个函数表达式,则这个函数表达式不会在预编译阶段被初始化,在函数表达式被赋值之前调用它同样会报一个Uncaught TypeError: say is not a function错误。
以下第一段代码使用var声明一个函数表达式,在被赋值前,因为已经在预编译阶段进行了初始化,所以它的值为undefined;
第二段代码使用const进行声明,因为预编译阶段没有对它进行,所以这个变量还不存在
console.log(say);
var say=function(){};
VM176:1 undefined
console.log(say);
const say=function(){};
VM199:1 Uncaught ReferenceError: say1 is not defined
3.预编译的时间
在全局作用域的所有代码在代码进入运行时就进行预编译,在函数作用域内的代码在函数被调用时进行预编译。