在 [ES2016] 中的 let 和块级作用域 我们讲解了 ECMAScript 2016 中引入的声明变量的新关键字,其实,那个规范还引入了另一个关键字 const
用于声明不可变变量,也有很多人称之为 「 常量关键字 」
const
const
的用法和作用域类似于 let
,唯一的差别就是 let
声明的变量是可变的,可以重复赋值,而 const
声明的变量是不可变的,不能再次赋值
例如下面的代码是可行的
let name = 'yufei'; console.log(name); name = 'hero'; console.log(name);
输出结果如下
yufei hero
但下面的代码是不可行的,会报错
const name = 'yufei'; console.log(name); name = 'hero'; console.log(name);
运行结果如下
yufei Uncaught TypeError: Assignment to constant variable.
意思是 name
是一个不可变变量,一定定义就不可重复赋值。
const 只声明而不赋值会报错
JavaScript 中的 const
不能像其它语言那样可以把声明和定义分开,声明而不定义 ( 赋值 ) 是会报错的
例如下面的代码
const name; console.log(name); name = 'yufei'; console.log(name);
运行结果如下
Uncaught SyntaxError: Missing initializer in const declaration
意思就是不可变变量 name
没有初始化。
JavaScript 中声明变量的方式
这应该是一个面试常考题目,在 ECMAScript 2016 没有出来之前,严格的说只有两种
var
声明一个变量function
声明一个函数
但 ECMAScript 2016 之后,因为添加了 const
、let
和 import
关键字,所以声明一个变量的方式编程了 5 种
const
声明一个不可变变量,也就是常量let
声明一个块级别的可变变量 ( 区分 const )import
从一个模块中导入一个变量
这五种声明变量的方法,作用域如下
变量提升 | 作用域 | Creates global properties | |
---|---|---|---|
var | Declaration | Function | Yes |
let | Temporal dead zone | Block | No |
const | Temporal dead zone | Block | No |
function | Complete | Block | Yes |
class | No | Block | No |
import | Complete | Module-global | No |
函数参数算不是算一种声明变量的方法呢 ?
其实吧,我觉得应该算,但是,好像没有哪个语言会把函数的参数当作一个变量来对待,虽然它长的的确和变量一样,而且作用域还是 function
级别的。
目前尚无回复