ES6-10常用知识梳理

本博客在持续更新中

目录

    • ES6(ES2015)
      • 变量与作用域
        • var与全局变量
        • 作用域
        • 作用域链
        • 词法作用域与动态作用域
      • 循环
        • for,while,do/while
        • for 循环
    • 结语
      • 参考

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,未声明的变量,函数作用域内会进行变量提升
	}

作用域

  1. 全局作用域:变量在函数外定义,变量拥有全局作用域
  2. 函数作用域:变量在函数内使用var定义,变量拥有函数作用域
  3. 块状作用域:变量在{}使用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])
}


for 循环

结语

参考

https://github.com/mqyqingfeng/Blog.

你可能感兴趣的:(ES6-10常用知识梳理)