var 、 let 和 const 究竟有什么区别? --<Javascript 学习笔记 6>
Lemon1x 39 0

Javascript 学习笔记 6

letconst 是 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 。

评论区

索引目录