ES6声明变量的六种方式:let、const(变量为只读常量,一旦声明,不能修改)、class、import、var、function —— 其中var、function是ES5声明变量的方式(全局)
简单说明ES6的变量:
1.在所在的区域块内才有效
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
------------------------------------------
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
2.不存在变量提升
console.log(foo);
var foo = 2; //2
----------------------------------------
console.log(foo);
let foo = 3; //报错
3.暂时性死区
if (true) {
// TDZ开始
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ结束
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
其中typeof也不是百分之百安全的操作: typeof x; //报错 let x; 因为x使用let声明,在声明之前都是x的“死区”
4.不允许重复声明变量与参数
function func(arg) {
let arg;
}
func() // 报错
function func(arg) {
{
let arg;
}
}
func() // 不报错
------------------------------------------
// 报错
function func() {
let a = 10;
var a = 1;
}
// 报错
function func() {
let a = 10;
let a = 1;
}
了解一下块级作用域与函数声明
ES5规定:函数只能在顶层作用域与函数作用于之中声明,不能再块级作用域声明。
// 情况一
if (true) {
function f() {}
}
// 情况二
try {
function f() {}
} catch(e) {
// ...
}
ES6规定:块级作用域中,函数声明语句作用类似于let,在块级作用于之外不做引用。
function f() { console.log('I am outside!'); }
(function () {
var f = undefined;
if (false) {
function f() { console.log('I am inside!'); }
}
f();
}());
理论上会返回“I am inside!”,但是在ES6的浏览器报错。因为环境差异太大,应该避免在块级作用域内声明函数,如果确实需要,可以将函数修改为函数表达式,例如:
// 块级作用域内部的函数声明语句,建议不要使用
{
let a = 'secret';
function f() {
return a;
}
}
// 块级作用域内部,优先使用函数表达式
{
let a = 'secret';
let f = function () {
return a;
};
}
this对象
全局环境:this => 顶层对象
Node模块和ES6模块:this => 当前模块
任何环境:globalThis => 顶层对象