var与let、const解析
var 与 let、const
为什么经典的var声明容易让人迷惑,然后介绍es6新引入的块级作用域绑定机制及其最佳实践。var声明及变量提升(hoisting)机制
在函数作用域或全局作用域中通过关键字var声明的变量,无论实际上是在哪里声明的,都会被当成在当前作用域顶部声明的变量,这就是我们常说的提升(hoisting)机制。
变量value的声明被提升至函数顶部,而初始化操作依旧留在原处执行,这就意味着在else字句中也可以访问到该变量,且由于此时变量尚未初始化,所以其值为 undefined。
所以, es6引入块级作用域来强化对变量生命周期的控制。
块级声明
块级声明用于声明在指定块的作用域之外无法访问的变量。块级作用域(亦被称为词法作用域)
存在于:
函数内部 块中 (字符 {和}之间的区域)let声明
let声明的用法和 var相同。用let代替var来声明变量,就可以把变量的作用域限制在当前代码块中。
由于let声明不会被提升,因此开发者通常将let声明语句放在封闭代码块的顶部,以便整个代码块都可以访问。
禁止重声明
假设作用域中已经存在某个标识符,此时再使用let关键字声明它就会抛出错误。
const声明
es还提供了const关键字,使用const声明的是常量,其值一旦被设定后不可更改。
因此,每个通过const声明的常量必须进行初始化。
//有效的常量 const name = 30; //语法错误:常量未初始化 const name;
const与 let
const与let声明的都是块级标识符,所以常量也只在当前代码块内有效,
一旦执行到块外会立即被销毁。常量同样也不会被提升至作用域顶部。
与let相似,在同一作用域用const声明已经存在的标识符也会导致语法错误,无论该标识符是使用var(在全局或函数作用域中),还是let(在块级作用域中)声明的。
var msg = "hello"; let age = 25; //这两条语句都会抛出错误 const msg = "hello"; const age = 30;
无论在严格模式还是在非严格模式下,都不可以为const定义的常量再赋值。
用const声明对象
用const声明对象后,可以修改该对象的属性值。
上一篇: js实现json数组分组合并操作示例