var
在 es6 中引入了 let 和 const 关键字声明变量,弥补了 var 关键字的缺陷
-
function scope
函数作用域,如果在函数中声明的变量,外部是访问不到的。 - 声明的变量是可以重新覆盖定义。
var a = 4;
function test(){
var a = 3;
}
console.log(a); // 结果:4
let
-
block scope
块级作用域,在大括号中声明的变量,外部是访问不到的。const
类似。
var price = 100;
var count = 10;
if(count > 5){
const discount = price * 0.6;
console.log(`The discount is ${discount}`); // 结果:The discount is 60
}
console.log(discount); // 结果:Uncaught ReferenceError: discount is not defined
- 在同一个作用域下,不能重复定义同一变量,
const
类似。
const
-
const
与let
不同的地方是,let
声明的变量是可以改变的,const
是不行的。
如果是引用类型的值
const person = {
name:'Dp',
age:30
}
person = {name:'tms'}; // 报错
person.age = 40; // ok
ps : 以上的例子一个是改变了对象,一个是改变了对象的属性,如果完全不想更改一个对象,可以使用Object.freeze(obj)
再来个例子
for (var i = 1; i < 10; i++) {
console.log(i);
setTimeout(function () {
console.log(`i:${i}`);
}, 1000);
}
这里把 var
可以换成 let
,const
试试。
ES6暂时性死区
console.log(color);
var color = 'yellow';
- 以上,
var
的情况会变量提升,会报undefined
; - 如果换成
let
、const
,会报ReferenceError: color is not defined
;
在 ECMAScript 2015 中,let 绑定不受变量提升的约束,这意味着 let 声明不会被提升到当前执行上下文的顶部。在块中的变量初始化之前,引用它将会导致 ReferenceError(而使用 var 声明变量则恰恰相反,该变量的值是 undefined )。这个变量处于从块开始到 let 初始化处理的”暂存死区“之中。 参考,
如果选择声明变量的方式
- 默认使用
const
- 会重新更新变量使用
let
- 不应该在ES6中使用
var
网友评论