本博客在持续更新中
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; // 块状作用域
}
}
作用域链
当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。
词法作用域与动态作用域
词法作用域,函数的作用域在函数定义的时候就决定了。javaScript采用的是词法作用域。
动态作用域,函数的作用域是在函数调用的时候才决定的。
//词法作用域
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar(); // 1,无论在哪里调用foo,输出的值始终为1,在函数定义的时候就确定了,因为javaScript采用的是词法作用域。
如果是动态作用域的话,调用bar() 时,foo() 会先向bar()函数内寻找变量 value,那么输出的结果为2
循环
循环语法之间的区别,以及运用的场景
for,while,do/while
基础的循环形式,可以使用 continue 和 break
const arr = [1, 2, 3, 4, 5]
for (let i = 0; i < arr.length; i++) {
if (arr[i] === 3) {
continue
}
console.log(arr[i])
}