概述
学习阮一峰《ES6标准入门》(第二版),所做的笔记。
一.let命令
let命令是ES6新增的命令,用来声明变量。它的用法类似于var 。它有以下特点:
1.它所声明的变量必须在let所在的代码块中。
{
var a=1;
let b=2;
}
console.log(a); // 打印出来a是1。
console.log(b); //打印出来b is not defined
上面的代码块中定义了两个变量,a是用var来定义的,b是用let来定义的,在代码块外调用里面的变量,let定义的变量在代码段内有效。
2.不存在变量提升现象
let不像var那样会发生 “ 变量提升 ” 现象。所以,变量一定要在声明后使用,否则报错。
{
console.log(a); //输出 undefined
console.log(b); //报错,输出b is not defined
var a=1;
let b=2;
}
上面的代码里变量a是用var来声明的,所以可以用到变量提升,脚本运行的时候变量已经存在,但是还没有值,所以会输出undefined。b用let声明的,这表明在声明它之前,变量b是不存在的,这时候如果用到它,就是报错。
3.暂时性死区
只要块级作用域内存在let命令,它所声明的变量就 “ 绑定 ”( binding )这个区域,不再受外部的影响。
ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
总之,在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。这在语法上,称为 “ 暂时性死区 ” ( 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
}
4.不允许重复声明
Let 不允许在同一个作用域下重复声明一个变量。
// 报错
function () {
let a = 10;
var a = 1;
}
// 变量a重复声明报错
二.const命令
const声明一个只读的常量。一旦声明,常量的值就不能改变。
const PI = 3.1415;
PI // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.
上面代码表明改变常量的值会报错。
const声明的变量不得改变值,这意味着, const 一旦声明变量,就必须立即初始化,不能留到以后赋值。
const foo;
// SyntaxError: Missing initializer in const declaration
上面代码表示,对于const来说,只声明不赋值,就会报错。
1.const的作用域与let命令相同:只在声明所在的块级作用域内有效。
if (true) {
const MAX = 5;
}
MAX // Uncaught ReferenceError: MAX is not defined
2.const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。
if (true) {
console.log(MAX); // ReferenceError
const MAX = 5;
}
上面代码在常量MAX声明之前就调用,结果报错。
const声明的常量,也与let一样不可重复声明。
var message = "Hello!";
let age = 25;
// 以下两行都会报错
const message = "Goodbye!";
const age = 30;
ES5 只有两种声明变量的方法:var命令和function命令。 ES6 除了添加let和const命令,后面章节还会提到,另外两种声明变量的方法:import命令和class命令。所以, ES6 一共有 6 种声明变量的方法。
三.ES6 的块级作用域
let实际上为 JavaScript 新增了块级作用域。
function f1() {
let n = 5;
if (true) {
let n = 10;
}
console.log(n); // 5
}
上面的函数有两个代码块,都声明了变量n,运行后输出 5 。这表示外层代码块不受内层代码块的影响。如果使用var定义变量n,最后输出的值就是10 。
ES6 允许块级作用域的任意嵌套。
{{{{{let insane = 'Hello World'}}}}};
上面代码使用了一个五层的块级作用域。外层作用域无法读取内层作用域的变量。
{{{{
{let insane = 'Hello World'}
console.log(insane); // 报错
}}}};
块级作用域的出现,实际上使得获得广泛应用的立即执行匿名函数( IIFE )不再必要了。
// IIFE 写法
(function () {
var tmp = ...;
...
}());
// 块级作用域写法
{
let tmp = ...;
...
}
四:全局对象的属性
全局对象是最顶层的对象,在浏览器环境指的是window对象,在 Node.js 指的是global对象。 ES5 之中,全局对象的属性与全局变量是等价的。
比如:
window.a = 1;
a // 1
a = 2;
window.a // 2
上面代码中,全局对象的属性赋值与全局变量的赋值,是同一件事。(对于 Node 来说,这一条只对 REPL 环境适用,模块环境之中,全局变量必须显式
声明成global对象的属性。)
ES6 为了改变这一点,一方面规定,为了保持兼容性,var命令和function命令声明的全局变量,依旧是全局对象的属性;另一方面规定,let命
令、const命令、class命令声明的全局变量,不属于全局对象的属性。也就是说,从 ES6 开始,全局变量将逐步与全局对象的属性脱钩。
如下例:
var a = 1;
// 如果在 Node 的 REPL 环境,可以写成 global.a
// 或者采用通用方法,写成 this.a
window.a // 1
let b = 1;
window.b // undefined
上面代码中,全局变量a由var命令声明,所以它是全局对象的属性;全局变量b由let命令声明,所以它不是全局对象的属性,返回undefined。
转载于:https://www.cnblogs.com/hongjingwu/p/8029489.html
最后
以上就是甜美小霸王为你收集整理的[学习笔记]01.let 和 const 命令的全部内容,希望文章能够帮你解决[学习笔记]01.let 和 const 命令所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复