在 ES6 之前,JavaScript 只有两种类型的作用域:全局作用域和函数作用域。
ES6 引入了两个重要的 JavaScript 新关键词:let 和 const
这两个关键字在 JavaScript 中提供了块作用域(Block Scope)变量(和常量)
全局作用域
全局(在函数之外)声明的变量拥有全局作用域。
实例
var carName = "porsche";
// 此处的代码可以使用 carName
function myFunction() {
// 此处的代码也可以使用 carName
}
全局变量可以在 JavaScript 程序中的任何位置访问
函数作用域
局部(函数内)声明的变量拥有函数作用域。
实例
// 此处的代码不可以使用 carName
function myFunction() {
var carName = "porsche";
// code here CAN use carName
}
// 此处的代码不可以使用 carName
局部变量只能在它们被声明的函数内访问。
块作用域(ES6新增)
其实就是用个花括号把某段代码括起来
在花括号里,用var声明变量会泄露到外部(外面可以访问,相当于全局变量了
),所以要用let(在能在块内部访问)
重复声明
- 全局已用var声明,块内用var重复声明导致变量值改变,因为上面已经说了,var在块内相当于在全局,而var是允许重复声明的)
- 全局已用var声明,块内用let重复声明,二者互不影响
- 同一作用域下,不能分别用let和var声明重复变量
- 同一作用域下,不能用let声明重复变量
- let声明的变量不会被提升
- var定义的全局变量属于window对象,let不
变量提升(Hoisting)
Hoisting 是 JavaScript 将所有声明(包括函数声明)提升到当前作用域顶部的默认行为(提升到当前脚本或当前函数的顶部)。
即我们可以在先使用(如赋值,作为参数传参等)后声明,先斩后奏!
严格模式
必须先声明再使用
在script标签包裹的代码中,第一句写上"use strict";即使用严格模式