关于var、let、const的自我反省
我其实在之前一直都对var、let、const有一个简单的了解,当面试官问我var、let的区别时我就回答了 其区别是let不能变量提升,我甚至连他们不可以重复声明都没有回答起来,他是我在学习中没有太重视的一小点,这也让我在面试中吃了不少亏。于是我打算彻底将他搞懂。。。。来看我表演吧
var
还是先说一下相同点把,使用var、let、const的变量是不可被delete的,不使用它们声明可以delete掉并且释放空间。
d = 1;var a =1;let b =2;const c =3;
delete a; // 打印出false
delete b; // 打印出false
delete c; // 打印出false
delete d; // 打印出ture
console.log(d) //Uncaught ReferenceError: d is not defined 说明d的空间被释放调
声明的变量实际上是window对象的属性,而在全局var声明的变量也相当于是一个window对象的属性,例:
a = 1;
var b = 2;
console.log(window.a) // 1
console.log(window.b) //2
在严格模式下使用
'use strict'
a = 1; // Uncaught ReferenceError: a is not defined
let
- 允许块级作用域任意嵌套
- 外层作用域无法读取到内层作用域的变量
- 内层作用域可以定义外层作用域的同名变量
- 函数本身的作用域在其所在块级作用域之内
'use strict'
function fn(){console.log('123')}
(function(){
if(true){
function fn(){
console.log('456')
}
})()
fn(); // 这里我加了严格模式 123 不会受到{}中fn影响;
注:let声明了一个块级作用域的变量在一个‘}’结果之后,该变量会消失
const
它是定义一个常量与let区别就是 不能重新赋值,会报错
var&let&const区别总结
- var定义的变量没有块的概念,可以跨快访问,不能跨函数访问,有变量提升,可重复声明
- let 定义的变量,只能在块作用域访问,不能跨快访问,也不能跨函数访问,无变量提升,不可重复声明。
- let 声明的变量只在块级作用域有效,不存在变量提升,而是绑定在暂时性死区或者说let变量提升了,但是在let声明变量前不能使用该变量,这种叫暂时性死区,如果有重复变量let会在编译阶段报错。