var、let、const 的区别

var 变量提升的原理

js 引擎工作方式:分为预处理和运行两个阶段

  • 首先解析代码,找到所有被声明的变量
  • 运行代码
  • function 方式定义的函数也会提升
  • var:存在变量提升
  • let:不存在变量提升,可改变值
  • const:不存在变量提升,不可改变指针,但可改变对象内部的值

实现 let

使用 IIFE

(function () {
    var a = 1;
    console.log(a);
})();

使用 try/catch

try {
    throw 2;
} catch (e) {
    var a = e;
    console.log(a);
}

实现 const

利用 proxy 或 defineProperty 拦截

var _const = function _const(data, value) {
    globalThis.data = value;
    Object.defineProperty(globalThis, data, {
        enumerable: false,
        configurable: false,
        get: function () {
            return value;
        },
        set: function () {
            if (data !== value) {
                throw new TypeError('Assignment to constant variable.');
            } else {
                return value;
            }
        },
    });
};

利用 Object.freeze

var b = Object.freeze({ a: 'aaa' });
b.a; // aaa
b.a = 1;
b.a; // aaa
Last Updated:
Contributors: zhangfei