ES6
javascript发展史
- 1995年 发明js (只能显示文字,负责表单验证),之前是叫LiveScript 蹭热度 改成JavaScript
- 1996年 发布JavaScript1.0和1.1版本
- 1997年 三足鼎立(JavaScript(网景)、JScript(微软 IE3)、scripteEase(nombas)) ECMA 以JavaScript1.1为蓝本发布了ECMAScript1.0
- 1999年 html4.0发布 微软提出异步传输,ActiveX,进入web2.0
- 2008年 Chrome V8 执行速度快
var
变量声明提升
可重复定义
可挂载到window
存在闭包问题
1.变量声明提升
console.log(a);
var a;
2.可重复定义
下面的a可能会导致代码块一出现问题,但因为var
可以重复定义,且不报错,所以就**无法定位问题**
var a=10;
/*代码块一*/
var a=20;
/*代码块二*/
3.可挂载到window
window里有很多属性,可能定义的变量名与window里的属性名相同,这就**导致window里原有的属性不能用**
var name;
window.name.....
4.只有两种作用域
全局作用域 window和函数作用域(函数执行产生的作用域)
存在闭包问题
var arr=[];
for(var i=0;i<10;i++){
arr[i]=function(){
console.log(i)
}
}
arr[0](); //10
arr[4](); //10
arr[7](); //10
let
1.没有变量声明提升
console.log(name); //报错,name未定义
let name = "dxb";
2.不可以重复声明变量
let name = "dxb";
let name = "dxb"; //报错,已经被定义过;
//混写也不可以
var name = "dxb";
let name = "dxb"; //报错,已经被定义过;
3.var可以变量提升
let name = "dxb";
console.log(window.name); //undefined
4.加强对作用域的控制(块级作用域 {}
)
{
let a=0; //只在这个{}里能用
}
console.log(a); //报错,未定义
{
let b=10;
{
console.log(b); //10
}
}
5.暂时性死区:发生在欲编译阶段 ——TDZ(temporal dead zone):
当JavaScript引擎在扫面代码时(即预编译),如果变量时通过var声明的,则整体提升;如果通过let提升,就会把变量放到TDZ中
如果使用的变量在DTZ中就会报错
在遇到声明变量的代码,如:let num = 2
就会把num
从TDZ中拿出来
let x = 10;
{
console.log(x)
let x =20; //报错,未定义
}
一定要先定义后使用
例1:let x = x;
报错;会先用右边的x,再声明
例2:
let i = 'window'; //不报错
for(let i = 0;i< 10;i++){ //不报错
let i ; //不报错
}
console.log(i); //打印window
6.解决了闭包问题
const
const 存的是常量,不可以改变.
//报错,没有给一个初始化的值
const a;
a=10;
//报错,不可以改变初始值
const b=20;
b=20;
存储常量的空间里的值不能被改变
const OBJ = {};
console.log(OBJ) //{}
OBJ .a=123;
console.log(OBJ.a) //123
类似于引用值和原始值的理解