一、ES6相关概念

1.什么是ES6
ES的全称是 ECMAScript,它是由ECMA国际标准化组织,制定的一项脚本语言的标准化规范。

二、ES6新增的语法

1.let命令,声明的变量只在所处于的块级有效

{
{
  let a = 10;  //let只能在{}内生效
  var b = 1;   //var全局变量,可以读出
}

a // 报错
b // 1
}

注意:使用let关键字声明的变量才具有块级作用域,使用var声明的变量不具备块级作用域特性。

1.1for循环

案例1
for (let i = 0; i < 10; i++) {
  // 这里的let 只在{}是有效的
  consol.log(i); //9
}
console.log(i); //结果为:undefined

案例2
var a = [];      //声明一个空数组
for (var i = 0; i < 10; i++) {   //遍历/循环
 a[i] = function () {     //函数  for循环在此结束了  所以i的值为10
console.log(i);   
	};
}
a[6](); // 10  调用函数体

案例3 属于块级作用域,你打的数值为6,最后的结果也会是6
var a = [];   //声明一个空数组
for (let i = 0; i < 10; i++) {
  a[i] = function () {  //
    console.log(i);
  };
}
a[6](); // 6


案例4
//循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
for(let i=0;i<10;i++){   //父作用域
let i = 100;    //子作用域
console.log(i);   //10个100
						};

2.不存在变量提升

// var 的情况
var a = 12;
function fn(){
alert(a);     //undefined
var a = 5;    //var 声明的变量有提升,提升到函数内的第一行,默认值为undefined
		}
fn()   //undefined 




// let 的情况
console.log(bar); // 报错
let bar = 2;
原因:let声明的变量必须先声明后使用,同时声明和赋值,初始值还是:undefined

3.暂时性死区
利用let声明的变量会绑定在这个块级作用域,不会受外界的影响

案例1
var tmp = 123;     //声明的全局变量
console.log(tmp);   //123   全局变量的值
			 
if (true) {    //块级作用域
//console.log(tmp);    //报错   let声明的变量必须先声明后使用   不存在变提升
tmp = 'abc'; // 报错   let声明的变量必须先声明后使用    此处不是window的属性而是了let声明的变量
let tmp;     //let声明的变量  
console.log(tmp);   //undefined   let声明的变量的初始值为undefined
console.log(tmp);  //"abc"  读取变量值
	}
			
console.log(tmp);   //123


案例2
let a = 18;   //全局作用域
function fn(){
alert(a);   //函数内的a是局部变量,let先声明后使用,此处为暂时性死区
let a = 5;
}
fn()  //报错

4.不允许重复声明同一个变量
let不允许在相同作用域内,重复声明同一个变量。

let t = 10;
			
let t = 66;
alert(t);   //报错,let不能多次声明同一个变量在相同的作用域

5.块级作用域

案例1
if(9){
let a = 8;   //if内let声明的变量是块级作用域,只在{}内有效
	}
alert(a);    //报错

案例2
{
   let m = 10;    //块级作用域
	{
	let m = 20;
	console.log(m);    //20
	}
console.log(m);    //10
}

6.块级作用域与函数声明

function f() { console.log('I am outside!'); }

(function () {   //立即执行函数
  if (false) {
    // 重复声明一次函数f
    function f() { console.log('I am inside!'); }
  }

  f();
}());




if (true){
let a = 10;lconsole.1og(a)
}
console.log(a)// a is not defined

7.小结

  • let关键字就是用来声明变量的
  • 使用let关键字声明的变量具有块级作用域
  • 在士个大括号中使用let关键字声明的变量才具有块级作用域var关键字是不具备这个特点的
  • 防止循环变量变成全局变量
  • 使用let关键字声明的变量没有变量提升
  • 使用let关键字声明的变量具有暂时性死区特性
8.作用域

1.全局作用域 声明在函数外 let const 和 var 都是

差别: var声明的全局变量是window的属性,let声明不是

2.局部作用域 声明在函数内 var 声明

3.块级作用域 声明在{}内 let/const声明

4.动态作用域 this的指向 当前对象