初学ES6(一) let和const
来源:互联网 发布:中科院自动化所 知乎 编辑:程序博客网 时间:2024/05/22 00:43
初学ES6
1. let,const声明变量
let,它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效
{ let a = 10; var b = 1;}a // ReferenceError: a is not defined.b // 1
在for循环中使用let和var的区别
var a = [];for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); };}a[6](); // 10
最后输出的是10。
var a = [];for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); };}a[6](); // 6
上面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6。你可能会问,如果每一轮循环的变量i都是重新声明的,那它怎么知道上一轮循环的值,从而计算出本轮循环的值?这是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。
另外,for循环还有一个特别之处,就是循环语句部分是一个父作用域,而循环体内部是一个单独的子作用域。
let是不存在变量提升的
// var 的情况console.log(foo); // 输出undefinedvar foo = 2;// let 的情况console.log(bar); // 报错ReferenceErrorlet bar = 2;
暂时性死区
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响,即使外部有一个同样命名的变量。
var tmp = 123;if (true) { tmp = 'abc'; // ReferenceError let tmp;}
ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
不允许重复声明
function func(arg) { let arg; // 报错}function func(arg) { { let arg; // 不报错 }}// 报错function () { let a = 10; var a = 1;}// 报错function () { let a = 10; let a = 1;}
块级作用域
为什么需要块级作用域
- 第一种场景,内层变量可能会覆盖外层变量。
var tmp = new Date(); function f() { console.log(tmp); if (false) { var tmp = 'hello world'; } } f(); // undefined
上面代码的原意是,if代码块的外部使用外层的tmp变量,内部使用内层的tmp变量。但是,函数f执行后,输出结果为undefined,原因在于变量提升,导致内层的tmp变量覆盖了外层的tmp变量。
2.用来计数的循环变量泄露为全局变量。
var s = 'hello';var i = 10;for (var i = 0; i < s.length; i++) { console.log(s[i]);}console.log(i); // 5
3.ES6的块级作用域
let实际上为 JavaScript 新增了块级作用域。
function f1() { let n = 5; if (true) { let n = 10; } console.log(n); // 5}
ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。
const命令
const声明一个只读的常量。一旦声明,常量的值就不能改变。
- 初学ES6(一) let和const
- # es6笔记(一):let和const
- ES6学习笔记(一)--let和const命令
- ES6的let和const命令(一)
- ES6学习(一)——let和const命令
- ES6(一) let和const命令
- 【ES6】let和const
- es6 let和const
- ES6-let和const
- es6 let和const
- ES6学习笔记(一)let const
- ES6(let 、const)
- 深入浅出ES6(十四):let和const
- ES6之一(let和const)
- 深入ES6 (二)let和const
- es6-1(let和const命令)
- ES6(一)const与let
- 【ES6系列】let和const
- Column name pattern can not be NULL or empty
- MySQL 的原生 JSON 操作
- Android Things SDK用法之UART篇
- 虚拟机安装spark配置推荐
- 内存优化
- 初学ES6(一) let和const
- TextView 最多显示2行,每行最多8个字,多余的显示....
- mysql ERROR 2027 (HY000): Malformed packet
- LeeCode 242. Valid Anagram
- 数据结构之线性表——约瑟夫环问题(循环链表的应用)
- 获取文件后缀的几种方式
- 天气推送服务器
- Delphi 用INI实现多语言界面的切换
- 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命