let 和var const 之间的区别

时间:2021-2-20 作者:admin

var 声明用法

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

var name = “livall”;

var 变量声明的特点

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

console.log(name);
var name = "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 明确规定,如果区块中存在letconst命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

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 规定暂时性死区和letconst语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在 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 之前使用它会报错。

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。