let与var的区别
- let有作用域,如果let在{}花括号里面,则他的作用域仅限于花括号里面,在外面输出会报错。
-
let不能重复声明,var的重复声明会覆盖上一个var,但是let不会,当你两次都声明一个变量时,系统也会给你报错。
- let没有变量提升,变量提升就是类似于
var i = 10;等价于var i;i=10;而且会把var i;自动提升到最前面
但是let没有,如果
consol.log(i);
let i = 10;
系统同样会给你报错,如果使用var,系统不会给你报错,
console.log(i);var i = 10;
这个时候控制台输出的值为undefined,这是因为此时的代码等价于
var i;console.log(i);i = 10
4.let有暂存死区
let man = "123456";
{
console.log(man);//左右为难,所以报错
let man = "654321"
}
console.log(man);
常量的规则:
常量拥有和let差不多的规则,即,常量有自己的作用域、不能重复声明、没有变量提升、暂存死区,除此之外,它比let还多了一条规则那就是不能改变自己的值,如下
const i = 10;
i = i+10;
console.log(i);//报错,因为常量一般不能被修改
系统会直接报错。
接下来做一下练习:
- 用循环输出按钮,当你点击每个按钮的时候,他会弹出自己是第几个输出的按钮
- 由于常量是ES6新增,那ES6之前是怎么使一个变量变为常量的
1.
for(let i = 1;i <= 10; i++){
let btn = document.createElement("button");
btn.innerText = i;
btn.onclick = function(){
alert(i)
console.log(i)
}
document.body.appendChild(btn);
}
如果没有let写起来将会很麻烦,输出的结果都是10,但是let会使整个过程变得简单。
2.
Object.defineProperty(Object,'freezeObj',{
value:function(obj){
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
Object.defineProperty(obj,i,{
writable:false
})
}
}
Object.seal(obj);
}
});
var xiaoming = {
age:18,
name:"张三",
function(){
console.log("123456")
}
}
Object.freezeObj(xiaoming)