let,const和var的详解

用let声明变量,它的用法类似var,但是let所声明的变量,只在所在的代码块内有效,即花括号{}(有些私有意思)

{
  let a = 10 
  var b = 1
}
console.log(a) //Uncaught ReferenceError: a is not defined
console.log(b) //1

let const 不存在变量提升,规范代码(必须先声明变量后使用,否则会报错)

console.log(foo); // 输出undefined
var foo = 2;

console.log(bar); // 报错ReferenceError
let bar = 2;

ES6 明确规定,如果块级作用域中存在let和const命令,这个区域对这些命令声明的变量,从一开始就形成了封闭作用域,不再受外部得影响。凡是在声明之前就使用这些变量,就会报错(暂时性死区)

//只要块级作用域内***存在***let命令,它所声明的变量就绑定这个区域,不再受外部影响
var tmp = 123;
if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}
//暂时性死区演示(temporal dead zone,简称 TDZ)
if (true) {
  // TDZ开始
  tmp = 'abc'; // ReferenceError
  console.log(tmp); // ReferenceError

  let tmp; // TDZ结束
  console.log(tmp); // undefined

  tmp = 123;
  console.log(tmp); // 123
}

let,const不允许在相同作用域内重复声明同一个变量,也不能在函数内部重新声明参数

// 报错
function func() {
  let a = 10;
  var a = 1;
}

function func(arg) {
  let arg;
}
func() // 报错

es5只有全局作用域和函数作用域,es6新增的let,const为JavaScript 新增了块级作用域,在块级作用域内定义的变量不会污染到块级作用域外

//外层代码不受内层代码的影响,注意:都是n这个变量名称
function f1() {
  let n = 5;
  if (true) {
    let n = 10;
  }
  console.log(n); // 5
}

const声明一个只读的常量。一旦声明,常量的值就不能改变

const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。

//只声明不赋值,就会报错。
const foo; // SyntaxError: Missing initializer in const declaration
posted @ 2021-01-12 14:11  君归何时  阅读(142)  评论(0)    收藏  举报