在ES2015后,引入了两个关键字let和const
let关键字
在引入let关键字和const之间,JavaScript里只有两种作用域:全局作用域和函数作用域,引入两个关键字后,提供了块级{}作用域
全局作用域:
全局(函数外面)声明的变量有全局作用域(使用var声明的),全局变量可以在JavaScript的任何地方访问。
函数作用域:
局部(函数里面)声明的变量拥有局部作用域(使用var声明的),局部变量只可以在被声明的函数内部使用。
块级作用域:
通过var申明的变量是没有块级作用域的,在{}里使用var声明的变量任然可以在{}外被访问。
使用let申明的变量拥有块级作用域
块级作用域可解决的问题:
(1)重新声明变量
在块级外使用var声明一个变量,在块级里也使用var声明同名的变量,会将外部的变量的值也修改了。
在块级外使用var声明一个变量,在块级里也使用let声明同名的变量,不会修改外部同名的变量的值。
(2)在函数内声明变量时候,使用var和let是相同的效果
(3)在函数外使用var和let声明变量都有全局作用域
Html中的全局变量:
使用JavaScript的情况下,全局作用域是JavaScript环境。在HTML中全局作用域是window对象。通过var关键字定义的全局变量属于window对象,通过let关键字定义的全局变量不属于window对象。
注意:
- 允许在程序的任何地方使用var重新声明JavaScript变量。
- 在相同的作用域,或在相同的快中,通过let重新声明一个var变量是不允许的。
- 在相同的作用域,或在相同的快中,通过let重新声明一个let变量是不允许的。
- 在相同的作用域,或在相同的快中,通过var重新声明一个let变量是不允许的。
- 在不同的作用域或者块中,通过let重新声明变量是允许的
通过var声明的变量会被提升到顶端,可以在声明变量之前就使用它
通过let声明的变量不会被提升到顶端,在声明它之前就使用它会出错。