Skip to content
导航

变量提升

在编译阶段,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命令是编译阶段执行的,在代码运行之前。

参考资料