ES5实现let 和const
let的特性
用来声明一个变量:
- 在块级作用域内有效,不能预处理,不存在变量提升,即未声明之前的代码不能调用
- 不能重复声明
通过匿名函数和闭包的形式来模拟let
(function(){
var c =3
console.log(c) //1
})()
console.log(c) //c is not defined
用匿名函数的作用域来模拟块级作用域,相当于将将用到let的代码放到匿名函数中,不会造成变量污染了
const的特性
用于声明一个常量,
- 在块级作用域内有效,不能预处理,不存在变量提升,即未声明之前的代码不能调用
- 不能重复声明
- 不允许修改绑定,但允许修改值
- 声明时必须进行初始化(赋值)
实现const
function _const(key, value) {
if (window.hasOwnProperty(key)) {
throw TypeError(`Cannot redefine property: ${key}`) // 不能重新声明
}
if (!value) {
throw TypeError('声明时必须初始化即需要赋值') // 声明时必须初始化即需要赋值
}
window[key] = value;
Object.defineProperty(window, key, {
enumerator: false,
configurable: false,
get: function () {
return value;
},
set: function (newValue) {
if (newValue !== value) {
throw TypeError('这是只读变量不可修改') // 只读变量不可修改
} else {
return value
}
}
})
}
_const('a', { avlaue: 'aaa' })
a.avalue = 'aaa2'
// a='aaa2' //报错 Uncaught TypeError: 这是只读变量不可修改
// _const('a', { avlaue: 'aaa2' }) // Cannot redefine property: a 不能重新声明
相关
JavaScript中对象的数据属性和访问器属性。
数据属性:
定义在对象内部的数据有四个特征:
- configurable:是否可以被 delete 删除或者改变特征值
- enumerable:是否能通过 for-in 循环遍历返回属性
- writable:是否可以修改属性的值
- value:保存这个属性的数据值
访问器属性:
- configurable:能否通过 delete 删除,能否修改属性特性
- enumerable:能否通过 for-in 循环返回属性
- getter:读取属性时调用的函数,默认为 undefined
- setter:写入属性时调用的函数,默认为 undefined