js ES6-变量const,let

版权声明:作者:shenroom 来源:CSDN 版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/qq_41772754/article/details/88086475
ES5 只有全局作用域函数作用域,没有块级作用域, ES6 增加的块级作用域.
  let   命令用来声明变量
  const 命令用来声明常量
用法类似于 var ,与 var 的不同之处:
  let,const 声明的变量,常量只在代码块内有效
  let,const 声明的变量,常量不能再重复声明
  let,const 声明的变量,常量不会提升, 存在暂时性死区,只能在声明的位置后面使用
  let,const 声明的全局变量,全局常量不属于顶层对象属性(例浏览器环境中不属于 window 的属性)
const 与 let 的不同之处:
  const 声明的常量必须立刻初始化赋值,不能留到后面再赋值
  const 声明的常量初始化赋值后不能更改(对于简单类型的数据:数值、字符串、布尔值)
ES6 规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在 ES5 是很常见的,现在有了这种规定,避免此类错误就很容易了。
ES5 只有两种声明变量的方法: var 命令和 function 命令。
ES6 除了添加let和const命令,另外两种声明变量的方法:import 命令和 class 命令。所以,ES6 一共有 6 种声明变量的方法。

不允许重复声明
   let,const不允许在相同作用域内,重复声明同一个变量。
//例1:
var a = 0;
let a = 1;                // 报错

//例2:
let a = 0;
let a = 1;                // 报错

//例3:
function func(arg) {
  let arg;                // 报错
}
function func(arg) {
  {
    let arg;              // 不报错
  }
}

块级作用域 “{}”

     ES6 允许块级作用域的任意嵌套。 外层作用域无法读取内层作用域的变量。

{{{
  let a = 0;
  let b = 1;
  {
    let a = 0;
    let c = 2;
    console.log(b)        //输出 1
  }
  console.log(c)          //报错
}}}
-------------------------------------------------------------------------------------------
let a = 0;
{
  var b = 1;
  let c = 2;
}
console.log(a)      // 0
console.log(b)      // 1
console.log(c)      // 报错 'c is not defined'
-------------------------------------------------------------------------------------------
//let在for循环中的使用
var a = [];
for (var i = 0; i < 10; i++) {      //变量 i 是 var 命令声明的,在全局范围内都有效,所以全局只有一个变量i
  a[i] = function(){
    console.log(i)
  }
}
a[6]();                //10
console.log(i);        //10

var b = [];
for (let g = 0; g < 10; g++) {     //变量 g 是 let 声明的,只在本轮循环有效,所以每一次循环的 g 其实都是一个新的变量
  b[g] = function(){
    console.log(g)
  }
}
b[6]();                //6
console.log(g);        //报错: g is not defined
块级作用域的出现,实际上使得获得广泛应用的立即执行函数表达式(IIFE)不再必要了。
// IIFE 写法
(function () {
  var tmp = 0;
  console.log(tmp)
})();

// 块级作用域写法
{
  var tmp = 0;
  console.log(tmp)
}
for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
//一般而言,在同一个作用域中 let 定义的变量不能重复定义
let a = 6;
let a = 5;
//此时浏览器会报错,因为 变量a被重复定义

看下面的例子

for (let i = 0; i < 3; i++) {
  let i = 'abc';
  console.log(i);   // 不会报错,因为对于for循环中 () 属于整个循环的父级作用域,{}属于单独的子作用域
}
// 三次结果都输出: abc 

猜你喜欢

转载自blog.csdn.net/qq_41772754/article/details/88086475
今日推荐