深入理解ES6--1.块级绑定
主要知识点有:var变量提升、let声明、const声明、let和const的比较、块级绑定的应用场景
1. var声明以及变量提升
变量提升:使用var声明变量,变量的创建并不在声明变量的地方,而是会在当前作用域的顶部。
如果声明在函数内,则变量的创建则会在函数作用域的顶部;如果声明不在函数内,则会提升到全局作用域的顶部。
示例
function getValue(condition){if(condition){var value = "yes";return value;}else{//value 在此处可访问,值为 undefinedreturn null;}//value 在此处可访问,值为 undefined } 复制代码等价于(var变量提升到当前函数作用域的顶部):
function getValue(condition){var value;if(condition){value = "yes";return value;}else{//value 在此处可访问,值为 undefinedreturn null;}//value 在此处可访问,值为 undefined } 复制代码由变量提升会带来循环变量过度共享的问题
2. let声明
与var声明变量语法一致,但是let声明变量不会变量提升,变量的作用域只会限制在当前代码块中。由于let变量并不会提升到代码块的顶部,因此,要想让整个代码块能给访问到let变量,需要将let声明指定到代码块的顶部。
示例
function getValue(condition){if(condition){let value = "yes";return value;}else{//value 在此处不可访问return null;}//value 在此处不可访问 } 复制代码let变量禁止重复声明:如果一个标识符已经在代码块内部中被定义,那么使用let以同样的标识符声明变量则会报错
示例: var count = 43; let count; //重复声明,报错 复制代码3. const声明
const声明基本变量
const声明:使用const声明一个常量,一旦设置之后就不能再被修改,否则会报错。也就是说,使用const声明变量后要立即初始化。
const type; type='TEST'; //Uncaught SyntaxError: Missing initializer in const declaration正确的为: const type='TEST' ----------------------------- const type='TEST' type = 'DEBUG' //ObjectMethod.html:244 Uncaught TypeError: Assignment to constant variable. 复制代码const声明对象
const只会阻止变量绑定以及变量的修改,但是不会阻止对象成员变量的修改。
const person = {name:'nancy'}; person.name= 'nike'; console.log(person.name); //nike person = {}; //Uncaught TypeError: Assignment to constant variable. 复制代码4. let与const的比较
相同点
不存在变量提升:let与const声明变量都不会存在变量提升,都只在块级作用域内,如果试图在代码块外访问let或者const变量都会报错;
禁止重复声明:如果在同一作用域内,禁止let或者const使用以被定义的标识符声明变量;
都具有暂时性死区(temporal dead zone,TDZ ):使用let或者const声明变量,如果在声明处之前访问变量会报错。在变量当前作用域的块内,变量声明处之前被称之为TDZ。
不会覆盖全局对象上的属性:let变量或者const变量会在全局作用域上创建新的变量,但是不会绑定到全局对象上(浏览器则是window对象),而var变量在全局作用域上会绑定到全局对象,也就是说,var全局变量可能会无意覆盖掉全局对象上的一些属性。
var RegExp = 'hello';console.log(window.RegExp); //helloconsole.log(window.RegExp===RegExp); //RegExp覆盖掉window对象中的RegExp属性-------------let RegExp = 'hello';console.log(window.RegExp);console.log(window.RegExp===RegExp); //falsefunction getValue(condition){if(condition){//value的TDZlet value = "yes";return value;}else{return value;}} 复制代码不同点
5. 块级绑定的使用场景
循环内的let声明
在循环中使用var变量,由于var变量存在变量提升,每次迭代共享同一个var变量。
for(var i = 0;i<5;i++){setTimeout(()=>{console.log(i); //输出5},1000);}console.log(i); //输出5 复制代码解决方法:将var变量改为let变量
//将var改成let之后for(let i = 0; i < 5; i++) {setTimeout(() => {console.log(i) // 0,1,2,3,4}, 0)}console.log(i)//Uncaught ReferenceError: i is not defined i无法污染外部函数 复制代码let变量不会变量提升,let变量作用域不会逃离出for循环外,因此不会污染外部函数。而在for循环中也不会每次迭代都共享同一变量,而是会分别使用let变量副本。
循环内const声明
在普通的for循环中使用const变量,由于const变量不可修改,因此会报错。而在for-in或者for-of循环中可以使用const变量。
let arr = [1,2,3,4];for(const item of arr){console.log(item); //输出1,2,3,4} 复制代码6. 总结
最佳实践:在默认情况下使用 const ,而只在你知道变量值需要被更改的情况下才使用 let 。
总结
以上是生活随笔为你收集整理的深入理解ES6--1.块级绑定的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 工作区 暂存区 版本库之间的关系
- 下一篇: spring boot 日志文件配置(l