Javascript 学习笔记 6
let 和 const 是 ECMAScript 6 (2015) 发布的两个声明的关键词。
const 是常量声明关键词,而 let 和 var 是变量声明关键词,但是请注意,const 和 let 不能重复声明,而 var 是可以的。
let name = 'Jack';
var age = 15;
name = 'Pete'; // Pete
age = 16; // 16
// ----
const money = 100000;
money = 10; // TypeError: Assignment to constant variable.
// 常量不能改变
var age = 15;
var age = 27; // 27
// ----
let name = 'Green';
let name = 'Wall'; // SyntaxError: Identifier 'name' has already been declared
const place = 'Beijing';
const place = 'Tianjin'; // SyntaxError: Identifier 'place' has already been declared
let 和 const 使用的是块级作用域声明,与 var 的全局作用域不同。
所以什么是块级作用域呢?
{
var global = 'I am the global scope';
let block = 'I am the block scope';
}
console.log(global); // I am the global scope
console.log(block); // ReferenceError: block is not defined
也就是块外面访问不到该变量,实际上这是很有用的,比如 for 、 case 内。
var 会 变量提升 (Hosting) , let 和 const 不会。
console.log(user); // undefined
var user = 'Dave';
console.log(version); // ReferenceError: Cannot access 'version' before initialization
let version = 'v1.5';
好吧,根据报错可知,实际上这时 JS 已经把 version 放进了内存,但为什么访问不了呢?因为 ECMAScript 做了规定,在let 和 const 声明前,变量会被放进暂存死区,虽然已经在内存中,但是虚拟机会阻止你访问。
let 和 const 不会挂载到全局对象,浏览器环境下为 window 对象,Node 环境下为 global 对象。
var password = '20190215abcd';
console.log(window.password); // 20190215abcd
let occupation = 'Programmer';
console.log(window.occpation); // undefined
这个设计让 let 和 const 不会污染全局对象,让程序员不必再去写丑陋的 IIFE (Immediately-invoked function expression)。
大多数情况,let 和 const 都比 var 更好用,但是并不是让你不用 var ,当有全局变量的需求时,可以选择 var 来声明变量,比如记录用户名之类的。
所以我的建议是,函数和类之外用 var ,函数和类之内用 let 和 const 。