1. var 声明
console.log(a) // undefined
var a = 1;
如上, console.log()会输出undefined而不会报错, 这是因为变量提升起到了作用
我们在用var定义一个变量时, 这个变量的定义会提升到方法体的最顶端
2. 函数声明
console.log(b) // f b(){}
function b(){}
函数声明定义的这个变量也会提升到方法体的最顶端.
3. 小总结
所以:
变量声明和函数声明都会被js解释器提升到发放提的最顶端.
在生成执行环境时,会有两个阶段。第一个阶段是创建的阶段,JS 解释器会找出需要提升的变量和函数,并且给他们提前在内存中开辟好空间,函数的话会将整个函数存入内存中,变量只声明并且赋值为 undefined,所以在第二个阶段,也就是代码执行阶段,我们可以直接提前使用。
4. let 和 const 定义变量并不会发生提升
console.log(a) // Uncaught SyntaxError: Identifier 'a' has already been declared
const a = 1;
console.log(b) // Uncaught SyntaxError: Identifier 'b' has already been declared
let b = 2;
这是因为let
和 const
存在局部(块)作用域的概念, 会出现暂时性死区.
let
不能在声明前使用,但是这并不是常说的 let
不会提升,let
提升了,在第一阶段内存也已经为它开辟好了空间,但是因为这个声明的特性导致了并不能在声明前使用。
5. 变量提升的优先级
函数声明提升的优先级高于变量声明的提升!