变量提升 
在编译阶段,var、function、import这些声明放入内存中。
var 
使用 var 声明的变量将在任何代码执行前被创建,这被称为变量提升。这些变量的初始值为undefined。
js
console.log(num) // undefined
var num = 1function 
函数声明被提升到外层函数体或全局作用域顶部,你可以在函数声明之前使用函数;
 函数表达式没有提升,不像函数声明,你在定义函数表达式之前不能使用函数表达式。
js
hoisted() // logs "foo"
notHoisted() // TypeError: notHoisted is not a function
function hoisted() {
  console.log('foo')
}
var notHoisted = function() {
  console.log('bar')
}import 
import命令具有提升效果,会提升到整个模块的头部,首先执行。
js
foo()
import { foo } from 'my_module'上面的代码不会报错,因为import的执行早于foo的调用。
 这种行为的本质是,import命令是编译阶段执行的,在代码运行之前。