变量提升
在编译阶段,var、function、import这些声明放入内存中。
var
使用 var
声明的变量将在任何代码执行前被创建,这被称为变量提升。这些变量的初始值为undefined
。
js
console.log(num) // undefined
var num = 1
function
函数声明被提升到外层函数体或全局作用域顶部,你可以在函数声明之前使用函数;
函数表达式没有提升,不像函数声明,你在定义函数表达式之前不能使用函数表达式。
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
命令是编译阶段执行的,在代码运行之前。