ES6
代码在浏览器环境运行!代码在浏览器环境运行!代码在浏览器环境运行!
我用的google!!!
变量声明 let
最最最基本用法
1 2
| let a = 11; alert(a); // 11
|
let与var的区别
1 2 3 4 5
| //声明后未初始化,输出相同. var a; let b; console.log(a); // undefined console.log(b); // undefined
|
使用在声明前的异同
1 2 3 4 5
| console.log(a); //输出undefined ==> 变量提升 var a= 'test var';
console.log(b); //直接报错:ReferenceError: b is not defined let b = 'test let';
|
重复声明问题 在相同的函数或块作用域内重新声明同一个变量会引发SyntaxError
1 2 3 4 5 6 7
| var a =5; var a =12; console.log(a);//必须注释下面的其中一个let声明
let b = 3; let b = 666; //报错 Identifier 'b' has already been declared console.log(b)
|
作用域问题
除了全局作用域和函数作用域,es6新增了块级作用域,即用{ }包裹的代码块。
块级作用域
内层变量和外层变量的值互不影响。内层无法读取外层,外层无法读取内层。
作用域问题
问题1: 如果是let声明的初始化表达式 在for循环外 访问i会报错 如果var声明的就不会报错
1 2 3 4 5
| for(let i=0; i<10; i++){
} //报错 alert(i);
|
问题2: 如果是let声明的初始化表达式 在for循环外 访问i会报错 如果var声明的就不会报错
1 2 3 4 5 6 7
| { console.log(a); //报错 {let a=12;} console.log(a) //报错 }
|
问题3: 事件中的索引问题 ==>简化内部函数代码
工作原理是因为(匿名)内部函数的3个实例引用了变量i的3个不同实例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <body> <script> var aBtn=document.querySelectorAll('input'); for(let i=0; i<aBtn.length; i++){ aBtn[i].onclick=function(){ alert(i); //弹出对应的 索引 //如果换成var声明 就会弹出 aBtn.length ==> 3 }; } </script> </head> <body> <input type="button" value="aaa"> <input type="button" value="bbb"> <input type="button" value="ccc"> </body>
|
问题4:在程序或者函数的顶层,let并不会像var一样在全局对象上创造一个属性
1 2 3 4
| var x = 'global'; let y = 'global'; console.log(this.x); // "global" console.log(this.y); // undefined
|
const 常量
特性
- 声明时就需要赋值,否则报错;一旦声明不可重新赋值,否则报错;
- 块级作用域
- 不存在变量提升;
- 存在暂时性死区;
- 声明引用类型常量时,const保存的是地址,常量中的属性还是可以变的;
块级作用域
1 2 3 4 5
| if(true){ const a=12; } //报错 常量的作用域 alert(a);
|
重复赋值
1 2 3
| const a=12; a=5; alert(a); // TypeError:Assignment to constant variable.
|
未初始化就使用
1 2
| const a; alert(a); // Uncaught SyntaxError: Missing initializer in const declaration
|