哈瞜大家好 我是阿华,今天来跟大家聊聊var 、 let 、const 三种宣告变数的差别
var 、 let 、const 三种宣告变数的差别
let 和 const主要解决了var三个问题,分别是没有块级作用域、重複宣告、变数提升,下面我们接着看:
作用域(Scope)区别:
在 ES6 以前 宣告变数是用 var,而它宣告的变数存在于函数作用域或全局作用域中。而 let 和 const 是在 ES6 中引入的,它们引入了块级作用域的概念,变数存在于它们被宣告的块(例如花括号 {})内部。
重複宣告:
使用 var 可以重複宣告同一个变数后面宣告会覆盖掉前面的,而 let 和 const 不允许在同一作用域内重複宣告相同的变数名。
变数提升:
var 有变数提升的特性,即无论在哪里宣告变数,它都会被提升至所在作用域的顶部,使得在宣告之前就可以使用该变数。
而 let 和 const 不具有变数提升,试图在变数宣告之前访问变数会产生暂时性死区(Temporal Dead Zone,TDZ)错误。
其他不同的点:
可变性:
let 宣告的变数是可变数,可以重新赋值。而 const 宣告的变数是常数,一旦赋值就不能再更改。
在 Window Object 中
使用 var 会在 Window Object 找得到,而 let 和 const 找不到。
适用场景:
在实际应用中,推荐使用 const,除非需要重新赋值,才考虑使用 let;而避免使用 var,因为它存在一些潜在的问题,比如变数提升、作用域与同一名称变数被覆盖的问题。
最后我们来看一个经典的例子:
// 综合 IIFE 闭包 作用域for (var i = 1; i <= 5; i++) { setTimeout(function () { console.log(i); }, 0);}
上面例子会打印5个5,要如何让他依序打印1-5呢?
第一种方法是使用let去宣告变数i,让它作用于它的块级作用域
for (let i = 1; i <= 5; i++) { setTimeout(function () { console.log(i); }, 0);}
第二种方法,是透过IIFE去给函数作用域并执行,让用var宣告的i作用于函数作用域
for (var i = 1; i <= 5; i++) { (function (i) { //相当于闭包 setTimeout(function () { console.log(i); }, i * 1000); })(i);}