一、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的指向 当前对象