Skip to content
本页目录

变量声明

区别

  • varvariable:变量)
    1. 没有块级作用域
    2. 变量声明提升
    3. 可重复声明
  • let
    1. 暂时性死区
    2. 块级作用域 (我理解的块级作用域是 let/const 配合 {} 产生)
  • const
    1. 暂时性死区
    2. 块级作用域
    3. 基本类型不能变更,引用类型可以使用 Object.freeze() 方法递归冻结

问题

1. 为什么要进行变量提升和函数提升

JS 引擎在读取 js 代码的过程中,分为两步:

  • 第一个步:对整个 js 代码解析读取,当浏览器的解析器遇到 varfunction 时,会将 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()
  1. var test 变量被提升声明;
  2. function test 被整体提升,所以此时 test 类型是一个 function;
  3. 顺序执行程序,对 test 进行赋值 test = 10, 类型变为 number;
  4. 当调用 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 不会,他们会被放到一个次于全局对象的词法环境中。