一篇文章带你深入了解JavaScript中let+var的特性

简介: 一篇文章带你深入了解JavaScript中let+var的特性

暂时性死区


上篇文章我们了解到了letvar之间的细微差别,同时它们之间还有一个区别就是let声明的变量不会在作用域中被提升

<script>
  //name会被提升
  console.log(name);  //undefined
  var name = "Matt";
  //age不会被提升
  console.log(age);   //ReferenceError   age未定义
  let age = 26 ;
</script>

浏览器在解析代码的时候,JavaScript引擎也会注意出现在块后面的let声明,只不过在此之前不能以任何方式来引用未声明的变量,在let声明之前的之星瞬间都被称为暂时性死区,在此阶段引用任何后面才声明的变量都会抛出ReferenceError


全局声明


与var关键字不同,使用let在全局作用域中声明的变量不会成为window对象的属性(var声明的变量会)

<script>
  var name = 'Matt';
  console.log(window.name);  // 'Matt'
  let age = 26 ;
  console.log(window.age);  // undefined
</script>

let声明是在全局作用域里面发生的,响应变量会在页面的生命周期内存续,为了避免SyntaxError,我们必须确保页面不会重复声明同一个变量


条件声明


我们在使用var声明变量的时候,由于声明会被提升,JavaScript引擎会自动将多余的声明在作用域顶部合并为一个声明,因为let的作用域是块,所以不可能检查前面是否已经使用let声明过同名变量,同时也就不可能在没有声明的情况下使用它

<script>
    var name = 'Nicholas'
    let age = 26;
</script>


注意注意注意!!!


对于let这个新的ES6关键字,不能依赖条件声明模式

不能使用let进行条件式声明是件好事,因为条件声明是一种反模式,它让程序变得更难理解


for循环中的let声明


let出现之前,for循环定义的迭代变量会渗透到循环体外部

<script>
    for(var i = 0 ; i < 5 ; ++i){
        //逻辑循环
    }
    console.log(i);
</script>

如果我们改成使用let,这个问题将会迎刃解决,因为迭代变量的作用域仅适用于for循环块内部

<script>
    for(let i = 0 ; i < 5 ; ++i){
        //逻辑循环
    }
    console.log(i);   //ReferenceError:  i没有定义
</script>

我们在使用var的时候,最常见的问题就是对迭代变量的奇特声明和修改

<script>
   for(var i = 0 ; i < 5 ; ++i ){
       setTimeout(() => console.log(i),0);        // 5 5 5 5 5
   }
</script>

之所以会这样,是因为退出循环的时候,迭代变量保存的都是循环退出的值:5。在执行超过逻辑时,所有的i都是同一个变量,因而输出的都是同一个最终值

而在使用let声明迭代变量的时候,JavaScript引擎在后台会为每个迭代循环声明一个新的迭代变量,每个setTimeout引用的都是不同的变量实例

<script>
   for(var i = 0 ; i < 5 ; ++i ){
       setTimeout(() => console.log(i),0);        // 1 2 3 4 5
   }
</script>


相关文章
|
2天前
|
JavaScript 前端开发 编译器
掌握现代化JavaScript:ECMAScript提案与特性
【10月更文挑战第13天】本文介绍了ECMAScript(ES)的最新提案与特性,包括可选链、空值合并运算符、类字段和顶层Await等。通过跟踪TC39提案、使用Babel或TypeScript、测试兼容性以及逐步迁移,开发者可以高效地采用这些新特性,简化代码、提高开发效率并增强应用功能。文章还提供了实战技巧,帮助开发者在现代Web开发中充分利用这些现代化的特性。
|
5天前
|
JavaScript 前端开发 索引
JavaScript ES6及后续版本:新增的常用特性与亮点解析
JavaScript ES6及后续版本:新增的常用特性与亮点解析
10 4
|
21天前
|
JavaScript 前端开发
【JavaScript】let,const和var的区别
总的来说,随着ECMAScript 6(ES6)及后续版本的推广,`let`和 `const`因其增强的块级作用域和对变量行为的更严格控制,逐渐成为现代JavaScript编码实践中推荐使用的变量声明方式。而 `var`由于其历史遗留的局限性,正逐渐被边缘化,但在维护老代码或处理特定兼容性需求时仍需了解。
19 3
|
27天前
|
JavaScript 前端开发 Oracle
软件工程师,学习下JavaScript ES6新特性吧
软件工程师,学习下JavaScript ES6新特性吧
39 9
|
1月前
|
JavaScript 前端开发
JavaScript let 和 const
JavaScript let 和 const
13 3
|
2月前
|
Rust JavaScript 前端开发
Rust! 无VDom! 尤雨溪解析 Vue.js 2024 新特性
Rust! 无VDom! 尤雨溪解析 Vue.js 2024 新特性
|
2月前
|
JavaScript 前端开发
使用 let 将有助于避免 JavaScript 中各种 var 引起的作用域问题。
这段内容介绍了JavaScript编程时的一系列最佳实践,包括使用`===`而非`==`进行比较、以`let`和`const`取代`var`定义变量、始终使用分号、采用合适的命名规范、利用模板字符串拼接、偏好ES6箭头函数、在控制结构中使用大括号、减少代码嵌套、应用默认参数、正确使用`switch`语句中的`break`与`default`分支、避免通配符导入以及简化布尔判断和避免不必要的三元运算符。遵循这些规则有助于提升代码的清晰度和可维护性。
17 2
|
2月前
|
Web App开发 前端开发 JavaScript
[译] JavaScript ES2021 中激动人心的特性
[译] JavaScript ES2021 中激动人心的特性
|
2月前
|
前端开发 JavaScript 开发者
翻天覆地!ES6+新特性大爆发,揭秘JavaScript代码的惊人蜕变!
【8月更文挑战第27天】自ES6标准发布以来,JavaScript新增的特性极大地提升了编程效率并简化了代码。本文重点介绍了五大特性:函数默认参数简化、模板字符串的强大功能、解构赋值的便捷性、箭头函数的简洁之美。这些特性不仅使代码更加简洁、易读,还解决了传统写法中的诸多问题。通过学习和应用这些新特性,开发者可以编写出更高效、更优雅的代码,以应对日益复杂的编程挑战。
57 2
|
2月前
|
JavaScript 前端开发 安全
JS 混淆解析:JS 压缩混淆原理、OB 混淆特性、OB 混淆JS、混淆突破实战
JS 混淆解析:JS 压缩混淆原理、OB 混淆特性、OB 混淆JS、混淆突破实战
99 2