首先,ES6 中新增了块级作用域。块作用域由 { } 包括,if语句和 for语句里面的{ }也属于块作用域。
- var定义的变量,可以修改,如果不初始化会输出undefined,不会报错。没有块的概念,可以跨块访问, 不能跨函数访问。
注意:var 声明的变量存在提升。
提升是指无论 var 出现在一个作用域的哪个位置,这个声明都属于当前的整个作用域,在其中到处都可以访问到。注意只有变量声明才会提升,对变量赋值并不会提升。如下例所示:
console.log(a); // 输出undefined
var a = 1;
该代码段跟下列代码段是一样的逻辑:
var a;
console.log(a); // 输出undefined
a = 1;
而如果对未声明过的变量进行操作,就会报错
console.log(b); /// 假设b未声明过,Uncaught ReferenceError: b is not defined
- let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。在同一个块级作用域,不能重复声明变量。
- const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。
<script type="text/ecmascript-6">
//块作用域
{
console.log(a); // 输出undefined
var a = 1;
console.log(b); // 报错 Uncaught ReferenceError: b is not defined
let b = 2;
// let b = 3; 报错 Uncaught SyntaxError: Identifier 'b' has already been declared
const c = 3;
// c = 4; 报错 Uncaught TypeError: Assignment to constant variable.
var aa;
let bb;
// const cc; 报错 Missing initializer in const declaration.
console.log(a); // 输出1
console.log(b); // 输出2
console.log(c); // 输出3
console.log(aa); // 输出undefined
console.log(bb); // 输出undefined
}
console.log(a); // 输出1
// console.log(b); 报错 Uncaught ReferenceError: b is not defined.
// console.log(c); 报错 Uncaught ReferenceError: c is not defined.
// 函数作用域
(function A() {
var d = 5;
let e = 6;
const f = 7;
console.log(d); // 输出5
console.log(e); // 输出6
console.log(f); // 输出7
})();
// console.log(d); 报错 Uncaught ReferenceError: d is not defined
// console.log(e); 报错 Uncaught ReferenceError: e is not defined
// console.log(f); 报错 Uncaught ReferenceError: f is not defined
</script>
网友评论