码迷,mamicode.com
首页 > 其他好文 > 详细

let与const命令

时间:2019-03-12 15:37:39      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:地方   one   声明   address   pre   ESS   erro   function   需要   

(需要注意的地方)

1、ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。

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

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

上面代码正确运行,输出了 3 次abc。这表明函数内部的变量i与循环变量i不在同一个作用域,有各自单独的作用域。

3、关于变量提升(笔试会给一些代码考察)

var命令会发生“变量提升”现象,即变量可以在声明之前使用,此时值为undefined

而let不存在变量提升,一定要在声明后使用,否则会报错。

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

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

4、暂时性死区(temporal dead zone)

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

总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

var tmp = 123;
if (true) {
  tmp = ‘abc‘; // ReferenceError
  let tmp;
}

上面代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。

if (true) {
  // TDZ开始
  tmp = ‘abc‘; // ReferenceError
  console.log(tmp); // ReferenceError

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

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

上面代码中,在let命令声明变量tmp之前,都属于变量tmp的“死区”。

5、不允许重复声明

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

6、为什么需要块级作用域?

第一种场景,内层变量可能会覆盖外层变量。

第二种场景,用来计数的循环变量泄露为全局变量。

7、const命令

const声明一个只读的常量。一旦声明,常量的值就不能改变。const一旦声明变量,就必须立即初始化,不能留到以后赋值。

const的作用域与let命令相同:只在声明所在的块级作用域内有效。

8、ES6 一共有 6 种声明变量的方式(有一次笔试遇到过)
var、function、let、const、import、class
 

let与const命令

标签:地方   one   声明   address   pre   ESS   erro   function   需要   

原文地址:https://www.cnblogs.com/songForU/p/10516875.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!