变量声明
区别
var
(variable
:变量)- 没有块级作用域
- 变量声明提升
- 可重复声明
let
- 暂时性死区
- 块级作用域 (我理解的块级作用域是
let/const
配合{}
产生)
const
- 暂时性死区
- 块级作用域
- 基本类型不能变更,引用类型可以使用
Object.freeze()
方法递归冻结
问题
1. 为什么要进行变量提升和函数提升
JS
引擎在读取 js
代码的过程中,分为两步:
- 第一个步:对整个
js
代码解析读取,当浏览器的解析器遇到var
与function
时,会将var
变量与function
整个函数提升到当前作用域最前面; - 第二个步:执行
js
代码
2. var 与 function 同名时,哪个会被覆盖?
JS
var test = 10;
function test () { }
test(); // test is not a function
var test = 10;
function test () { }
test(); // test is not a function
执行步骤:
JS
var test // undefined
function test() {} // 提升
test = 10
test()
var test // undefined
function test() {} // 提升
test = 10
test()
var test
变量被提升声明;function test
被整体提升,所以此时test
类型是一个function
;- 顺序执行程序,对
test
进行赋值test = 10
, 类型变为number
; - 当调用
test
函数时,此刻test
已经是number
类型了,所以发生错误;
JS
console.log(typeof a); // function
var a = 1;
function a(){ }
console.log(typeof a); // number
console.log(typeof a); // function
var a = 1;
function a(){ }
console.log(typeof a); // number
ES6 为了改变 var 定义的全局变量变为顶层对象的问题,设计了 let 与 const 方式,为了保持兼容性,既支持 ES5 写法,也支持 ES6 写法
var 声明的变量会被挂在到全局对象 window 上,而 let、const 不会,他们会被放到一个次于全局对象的词法环境中。