function calculateTotalAmount (vip) {
var amount = 0; // probably should also be let, but you can mix var and let
if (vip) {
let amount = 1; // first amount is still 0
}
{ // more crazy blocks!
let amount = 100; // first amount is still 0
{
let amount = 1000; // first amount is still 0
}
}
return amount;
}
console.log(calculateTotalAmount(true)); // 0
看过《JS高程》没?
知道
引用型变量
和基本类型变量
的区别吗?如果你看过,并且明白这俩是啥意思,类比到
const
就行了。所谓
常量的值
就是指基本类型
常量,而常量指向的值
就是指引用类型
常量。常量的意义当然就是
值
不可变。基本类型
常量的值不可变很容易理解,但是对于引用类型
常量,这类常量的值也不可变,但是是计算机意义上的值不可变,它本质上的值记录的是所引用数据的内存地址。所以对于这类常量而言,const
的效果仅限于引用不可变,但是其实际指向的值
是可变的。举个例子,下面这俩操作,上面是非法的,而下面是合法的:
如果
const a=123
这种声明一个常量赋值一个基本类型值,没有任何问题;但是如果
const a={name:'Li'}
这种常量赋值了一个引用类型值,常量中保存的是一个地址,这个地址不能变,但是我们可以修改地址指向对象的属性。const是只读的常量、指向数据所在的地址
ES6 你可能不知道的事 - 基础篇
块作用域和构造let和const
const let
所以上面代码中,所有使用 let 的部分,其实都应该是用 const 的。