var,let,const

首先需要理解作用域:全局作用域、函数作用域、块级作用域(block scope)

变量提升的概念

前提:在chrome浏览器环境下

全局作用域:

      

函数作用域:

        

块级作用域:

       通过let,const 在 {  }中声明变量,可形成块级作用域

       

     但是令人怪异的是

      

      在for循环的 { } 中可以获取到声明的 'block scope'  i 但是却获取不到  ( ) 中的 i,令人十分诧异

    

 

 

### JavaScript中`var`、`let`和`const`的区别 #### 定义与作用域差异 在JavaScript中,`var`是在ECMAScript的所有版本中都可用的关键字,用于声明变量。然而,它存在一些不直观的行为,比如函数级的作用域而不是块级作用域,这可能导致意外的结果[^4]。 相比之下,`let`和`const`是ES6引入的新特性,旨在解决这些问题并提供更好的编码习惯支持。这两个关键字具有块级作用域,意味着它们只在其定义所在的代码块内有效(例如if语句或for循环内部),从而减少了全局污染的风险,并提高了代码的安全性和可预测性[^3]。 #### 提升机制的不同处理 另一个显著区别在于变量的“提升”。当使用`var`声明时,无论实际位置如何,该声明都会被移动到当前执行上下文顶部,即所谓的“提前加载”,但这可能会引发难以调试的问题;相反,`let`和`const`不会发生这种自动提升现象,因此更加符合直觉,有助于防止潜在错误的发生[^1]。 #### 不变性的考量 关于不变性方面: - `const`用来创建常量,默认情况下不允许重新赋值给已初始化过的标识符; - 虽然可以用`const`来定义对象或数组这样的复杂数据结构,但是这些容器的内容是可以更改的——只是不能再指向新的内存地址而已; - 对于那些在整个生命周期里都不应该发生变化的数据项来说,首选应该是`const`,因为这样能表达出意图上的不可变性质,同时也便于其他开发人员理解这段程序逻辑[^2]。 ```javascript // 正确的做法:尽可能多地利用 const 来代替 let 或者 var const PI = 3.14; console.log(PI); // 输出: 3.14 // 尝试修改由 const 创建的对象属性仍然是允许的 const person = { name: 'Alice' }; person.age = 25; // 这样做没问题 console.log(person); // 输出: {name:"Alice", age:25} // 错误示范:尝试直接重置整个 const 变量会抛错 try { person = {}; // TypeError will be thrown here. } catch (e) { console.error(e); } ``` #### 推荐的最佳实践 为了确保编写的JavaScript应用程序既高效又易于维护,建议遵循以下指导原则: - **优先选用`const`**:除非必要,否则总是先考虑用`const`去声明新变量。这样做不仅能够减少不必要的变更操作带来的风险,而且还能让阅读代码的人更容易明白哪些地方不应该随意改动。 - **适当应用`let`**:如果确实需要在一个范围内多次更新某个值,则可以选择`let`作为替代方案。不过要注意控制好范围大小,避免过度泛滥地滥用动态变化的可能性。 - **谨慎对待`var`**:鉴于上述提到的各种局限性,最好尽量少用甚至不用`var`。特别是在大型项目或者团队协作环境中更是如此,以降低因历史遗留问题而导致的理解成本和技术债务累积概率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值