本博客在持续更新中
目录
ES6(ES2015)
变量与作用域
- 我们看到一个变量定义的时候,我们要知道这个变量的生命周期和作用范围是什么
- 当我们看到一个变量时,我们要知道引用的是哪里定义的变量。
var与全局变量
var在全局中声明,则为全局变量;在方法中声明,则为局部变量
// 全局变量
var a = 5;
console.log(a); // 5
console.log(window.a); // 5 ,JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。
// 局部变量
function fun() {
var b = 10;
}
console.log(b); // b is not defined
未声明的var变量,在函数作用域内会进行变量提升,如果在函数外定义,自动成为全局对象window的属性。并不是真正的全局变量
// 变量提升
a = 5;
console.log(a); // 5
console.log(window.a); // 5
delete a; // true,全局变量是不能被删除的,所以a不是真正的全局变量
function a () {
if (true) {
var b = 10;
}
console.log(b); // 10,未声明的变量,函数作用域内会进行变量提升
}
作用域
- 全局作用域:变量在函数外定义,变量拥有全局作用域
- 函数作用域:变量在函数内使用var定义,变量拥有函数作用域
- 块状作用域:变量在{}使用let定义,变量拥有块状作用域
补充:let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。
// 全局作用域
var a = 5;
function () {
var b = 2; // 函数作用域
if (true) {
let c = 3