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