变量申明类型
- var
- let
- const
var
在ES5阶段,用var定义变量,此阶段具有以下特点:
-
- 没有块的概念,可以跨块访问,不能跨函数访问;
-
- 存在变量提升。
变量提升概念
变量提升即将变量声明提升到它所在作用域的最开始的部分。
console.log(a); // undefined
var a = 2;
//实际顺序是
var a;
console.log(a);
a = 2;
let
在ES6阶段,出现了块大概念,新增了块级作用域,同时新增了let命令,let声明大变量具有以下特点:
-
- let声明的变量只在它所在的代码块有效;
-
- 不存在变量提升。let不会像var那样会发生 变量提升 现象,因此,变量需要先声明后再使用,否则会报错;
-
- 暂时性死区。在代码块内,使用let命令声明变量之前,该变量都是不可用的;
-
- 不允许重复声明。
const
在let命令出现的同时,出现了const命令,其用于声明一个只读的常量,具有以下的特点:
-
- 一旦声明就必须立即初始化;
-
- 一旦声明,常量值就不能改变了(指的是内存地址不能改变);
-
- 块作用域内有效;
-
- 不存在变量提升;
-
- 存在暂时性死去。
函数提升
js在执行之前,会把foo函数提升到最前面,所以我们在fn函数定义之前就可以使用fn函数。
fn(); // 函数执行 打印 fn
function fn(){
console.log("fn");
}
// 执行顺序
function fn(){
console.log("fn");
}
fn(); // 函数执行 打印 fn
函数提升优先级大于变量提升
fn(); // 函数执行 打印 fn
var fn;
function fn(){
console.log("fn");
}