javascript的变量声明

在代码中,声明变量是基础,可是在javascript中,经历了从var到let,const的变化,到底有什么本质上的区别呢?javascript

本文的原文在个人博客中:https://github.com/RachelRen/blog/issues/25java

欢迎stargit

var 声明的提高

  1. var 无论在哪里声明的,都会被当成在当前做用域顶部声明的。
  2. 变量提高是在预编译的过程当中发生的,赋值为undefined
  3. 被声明的变量仍是在原来的地方,真正被赋值

块级声明

块级声明用于声明在指定块的做用域以外没法访问的变量。github

  1. 在同一做用域内,相同的标识符只能有一个
  2. 当执行流离开这个块级,那么这些变量会被销毁
  3. 块级做用域中的变量会屏蔽全局做用域中的相同标识符的变量(即取的是块级做用域中的值)
  4. const 不能再赋值,可是能够修改对象的属性值
  5. 不会变量提高

临时死区

let 和 const 是不会变量提高的,因此在声明变量以前,是用typeof是会报错的。浏览器

临时死区(TDZ)用来描述let/const不提高的效果code

Javascript引擎在扫描代码发现变量声明时,要么将他们提高到做用域顶部(var声明),要么将声明放到TDZ(临时死区)中,访问TDZ中的变量会触发运行时错误。 只有执行变量声明语句后,变量才会从TDZ中移出,而后才能够正常访问

let 声明在循环内部的行为是标准中专门定义的,它不必定与let的不提高特性相关。对象

在循坏中的应用

在for-in 和 for-of 循环中,let和const会每次迭代时建立新绑定,因此在循环体内,每次都访问到响应的迭代值。但在for-lenght中,const会报错。blog

在全局做用域中的区别

var在全局做用域中,会建立一个新的全局变量做为全局对象。
let/const会在全局做用域下建立一个新的绑定,可是这个绑定不会添加为全局对象的属性(let/const不能覆盖全局,只能屏蔽它)ip

用var来定义全局变量,能够用在浏览器的跨frame或跨window访问代码。作用域

最佳实践

默认使用const,只在肯定须要改变值的时候用let。为了实现代码的不可变,防止某些错误的产生。

相关文章
相关标签/搜索