let 和var const 之间的区别

var 声明用法

var 是声明变量的关键字,变量名称最好含义明确,以字母或者下划线开始或者$,跟上数字字母下划线,不能用特殊符号,比如我要声明一个“name”为“livall“ 的变量,则可以这样写

var name = “livall”;

var 变量声明的特点

1.变量提升,意思是说可以先用后声明,程序不会崩溃,举个例子:

console.log(name);varname="livall";

2.其作用域为该语句所在的函数内

function getName(){

var myName = 'livall';

console.log(myName)

}

getName()

console.log(myName)

直接在 getName()函数外console.log(myName)会报错,var myName 只会在函数getName()内起作用。


let 声明的用法

let 和const 是ES6 新增的两个关键字,let 的用法类似于var, 但是所声明的变量,只在let命令所在的代码块内有效。

基本用法

{

let a = 0;

console.log(a)  // 0

}

console.log(a)  // 报错 ReferenceError: a is not defined

上面代码在代码块之中,用let声明了变量a。然后在代码块之外调用这个变量,结果报错,这表明,let声明的变量只在它所在的代码块有效。所以对于for循环就很适合,比如下面这个例子

for (var i = 0; i < 10; i++) {

  console.log(i)

}

原本你是想打印0到9的,但是你会发现最后输出的全是10;

如果你用let 就不一样了,会得到你想要的结果。


不存在变量提升

console.log(a);  //ReferenceError: a is not defined

let a = "livall"; 

变量 a 用 let 声明不存在变量提升,在声明变量 a 之前,a 不存在,所以会报错。

暂时性死区 (temporal dead zone,简称 TDZ)

ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

if (true) {

  // TDZ开始

  name = 'livall'; // ReferenceError

  console.log(name); // ReferenceError

  let name ; // TDZ结束

  console.log(name ); // undefined

  name  = livall;

  console.log(name ); // livall

}

“暂时性死区”也意味着typeof不再是一个百分之百安全的操作。

typeof x; // ReferenceError

let x;

ES6 规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在 ES5 是很常见的,现在有了这种规定,避免此类错误就很容易了。

总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

不允许重复声明

let不允许在相同作用域内,重复声明同一个变量。

// 报错

function func() {

  let a = 10;

  let a = 1;

}

const 声明的用法

基本用法

const 声明一个只读变量,声明之后不允许改变。意味着,一旦声明必须初始化,否则会报错。

const name = “livall”

暂时性死区

if(true){

  console.log(name);  // ReferenceError: name is not defined

  const name = "livall";

}

ES6 明确规定,代码块内如果存在 let 或者 const,代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。代码块内,在声明变量 PI 之前使用它会报错。

你可能感兴趣的:(let 和var const 之间的区别)