变量申明以及变量提升函数提升

90 阅读1分钟

变量申明类型

  • var
  • let
  • const

var

在ES5阶段,用var定义变量,此阶段具有以下特点:

    1. 没有块的概念,可以跨块访问,不能跨函数访问;
    1. 存在变量提升。

变量提升概念

变量提升即将变量声明提升到它所在作用域的最开始的部分。

console.log(a); // undefined
var a = 2;


//实际顺序是
var a;
console.log(a);
a = 2;

let

在ES6阶段,出现了块大概念,新增了块级作用域,同时新增了let命令,let声明大变量具有以下特点:

    1. let声明的变量只在它所在的代码块有效;
    1. 不存在变量提升。let不会像var那样会发生 变量提升 现象,因此,变量需要先声明后再使用,否则会报错;
    1. 暂时性死区。在代码块内,使用let命令声明变量之前,该变量都是不可用的;
    1. 不允许重复声明。

const

在let命令出现的同时,出现了const命令,其用于声明一个只读的常量,具有以下的特点:

    1. 一旦声明就必须立即初始化;
    1. 一旦声明,常量值就不能改变了(指的是内存地址不能改变);
    1. 块作用域内有效;
    1. 不存在变量提升;
    1. 存在暂时性死去。

函数提升

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"); 
}