【ES6】let 命令

天大地大妈咪最大 提交于 2020-01-29 21:08:57

let命令

为es6新增命令,用来声明变量,类似于var,但是let所声明的变量,只在let命令所在的块级作用域内有效

块级作用域写法(ES6块级作用域允许任意嵌套):

// 块级作用域写法
{
  let tmp = ...;
  ...
}

 

块级作用域例1

for (let i = 0; i < 10; i++) {
  // ...
}

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

解析:上面代码中,i作用域for循环体内,在循环体外引用就会报错。

块级作用域例2

function f1() {
  let n = 5;
  if (true) {
    let n = 10;
  }
  return n 
}console.log(f1())//5

解析:栗子说明,外层代码块不受内层代码块的影响。

 

 

---------------------------------------------------------------------------------------------------------------------------------

let与var的区别

1.var 没有块级作用域,let有块级作用域

var实例

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10

分析:代码中,i全局范围内有效,所以全局只要一个变量i。每一次循环,变量i的值都会发生变化,而数组a函数内部的console.log(i),里面的i和全局i为同一个。

let实例

var a = [];
for (let i = 0; i < 10; i++) { a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6

分析:代码中的i使用let声明的,只在本轮循环有效,每一次循环的i其实都是一个新的变量(why?javascript引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算)

另外,for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域

for (let i = 0; i < 3; i++) {
  let i = 'abc';
  console.log(i);
}

2.var 存在变量提升let不存在变量提升("变量提升"是指变量可以在声明之前使用,值为undefined·)

例:

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

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

 3.let暂时性死区

只要块级作用域内存在let命令,它所声明的变量的作用域就是这个区域,

例如

var tmp = 123;

if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}

解析:tmp的作用域为块级作用域,报错原因:未声明直接使用,

4.let不允许重复声明

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

例子

// 报错 Uncaught SyntaxError: Identifier 'a' has already been declared
function func() {
  let a = 10;
  var a = 1;
}

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

 

扩展:不能在函数内部重新声明参数

function func(arg) {
  let arg; // 报错,相同的作用域内
}

function func(arg) {
  {
    let arg; // 不报错 函数参数arg 和此处的arg不在同一个作用域内
  }
}

 总结:

1.let命令有块级作用域
2.let命令先声明再使用
3.let命令不可重复声明(同一作用域)

 

 

相关资料:http://es6.ruanyifeng.com/#docs/let

作者:smile.轉角

QQ:493177502

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!