let和const出现的原因
JavaScript有别于其他一些语言,允许重声明,而且存在着变量提升这一现象,造成不熟悉JavaScript的开发者的不适应和许多bug,同时,JavaScript ES6之前只有全局作用域和函数作用域,没有块级作用域的存在,给开发中带来了很多不便。
基于以上情况,在ES6中引入了let和const这两种声明方式。
let和const的区别
let和const很类似,都禁止重声明、变量提升,都有块级作用域,但有一点区别是const声明不允许修改绑定且声明时必须进行初始化。
注:const声明不允许修改绑定,但允许修改值,例:
const p={
name:'Tom'
}
p.name='Jack'//p是一个对象引用,并没有改变
//抛出语法错误
p={
name:'Alice'
}
ES5实现let
(function(){
var c =3
console.log(c) //1
})()
console.log(c) //c is not defined
ES5实现const
我们必须先了解JavaScript中对象的数据属性和访问器属性。
数据属性
定义在对象内部的数据有四个特征:
-
configurable:是否可以被 delete 删除或者改变特征值
-
enumerable:是否能通过 for-in 循环遍历返回属性
-
writable:是否可以修改属性的值
-
value:保存这个属性的数据值
访问器属性
指以下四个属性:
-
configurable:能否通过 delete 删除,能否修改属性特性
-
enumerable:能否通过 for-in 循环返回属性
-
getter:读取属性时调用的函数,默认为 undefined
-
setter:写入属性时调用的函数,默认为 undefined
function _const(key, value) {
window[key] = value;
Object.defineProperty(window, key, {
enumerable: false,
configurable: false,
get: function () {
return value;
},
set: function (newValue) {
if (newValue !== value) {
throw TypeError("这是只读变量,不可修改");
} else {
return value;
}
},
});
}