对比分析 ES6 的 const
、let
、var
三种声明变量的方式
随着 ECMAScript 2015 规范(也称为 ES6)的发布,JavaScript 语言的变量声明方式也得到了改善和升级。其中,const
、let
和 var
是常见的三种声明变量的方式,本文就这三种方式进行分析和对比,以便开发者们了解它们之间的差别。
var
变量
在 ES5 及之前版本中,使用 var
关键字声明变量已是老生常谈;ES6 仍然可以使用 var
,但是 let
和 const
关键字的出现使得 var
的应用日益流行。
var
变量是 function-scoped,即只有在当前作用域下存在,而超出当前作用域就不再存在,容易出现变量声明提升(hoisting)的情况。例如:
function test() { console.log(name); // undefined var name = 'Alice'; console.log(name); // 'Alice' }
这段代码会输出 undefined
和 Alice
,这是因为第一行中 name
确实被声明了,但还未被赋值,而在第二行中,name
已经被赋值。变量声明提升也意味着,var
作用域可能被覆盖,从而引发一些隐含的错误。例如:
-- -------------------- ---- ------- --- ---- - ------ -------- ------ - ------------------ -- --------- --- ---- - -------- ------------------ -- ------- - ------- ------------------ -- -----
上面这段代码既有函数作用域,又有全局作用域。它的输出结果分别为:undefined
、Alice
、Bob
。这是因为函数中的变量 name
被提升了,变成了函数作用域内的变量。
let
变量
ES6 引入了一个新的关键字 let
,用来声明块级作用域的变量。与 var
不同,let
变量只在它存在的代码块中生效,而且不存在变量提升,也就是没有创建阶段。例如:
function test() { let name = 'Alice' console.log(name) } test()
以上代码将输出 Alice
。
在同一个作用域中,let
不能声明同名的变量,否则程序就会抛出错误。例如:
let name = 'Alice' let name = 'Bob'
以上代码会抛出 Uncaught SyntaxError: Identifier 'name' has already been declared
的异常。
const
常量
与 let
不同,const
关键字声明的变量是固定不变的信息,即常量。常量不仅是块级作用域,还具有和 let
类似的限制和特点,但一旦在声明后,就不能再次赋值。例如:
const PI = 3.14159; PI = 3.14; // TypeError: Assignment to constant variable
在其它方面,const
与 let
基本一致,尽管它只是声明了一个常量。
总结
var
变量是函数级作用域,而let
和const
变量是块级变量。- 变量声明提升(hoisting)在
var
中可能出现,但在let
和const
中不会出现。 - 可以为
let
重新赋值,但是不能改变const
变量的值。 - 在同一作用域下,不能在变量名相同时使用
let
。 - 尽可能使用
const
,这有助于提高代码的可维护性和应用的安全性。
以上就是 ES6 中常用的变量声明方式的详细分析和介绍,这对于前端开发人员来说,可以更好地理解 JavaScript 的变量作用域,并且以更好的方式使用变量。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6458ecb3968c7c53b0b3ba5d