let
let用来申明变量
1.作用域只局限于当前代码块
{
var str='bob';
console.log(str);//right
let str1='bob1';
console.log(str1);//right
}
console.log(str);//right
console.log(str1);//error: str1 is not defined
2.作用域不会被提升
{
console.log(str2);//error: undefined
var str2='lucy';
}
{
console.log(str3);//error: str3 is not defined
let str3='lucy';
}
3.在相同作用域下不能申明相同的变量
{
var str4='cc';
var str4='bb';
console.log(str4);//bb
}
{
let str5='cc';
let str5='bb';
console.log(str5);//error: Identifier 'str5' has already been declared
}
4.for 循环体现 let 的父子作用域
var btns=document.querySelectorAll('button');
for(var i=0;i<btns.length;i++){
(function(i){
btns[i].onclick=function(){
alert('点击了第'+(i+1)+'个按钮');
};
})(i);
}
let btns=document.querySelectorAll('button');
for(let i=0;i<btns.length;i++){
btns[i].onclick=function(){
alert('点击了第'+(i+1)+'个按钮');//let作用域规范化 所以可以正常显示点击了第几个按钮
}
}
const
const用来申明常量
1.只在当前代码块有效(同let)
{
const str = 'bob';
console.log(str);//bob
}
console.log(str);//error: str is not defined
2.作用域不会被提升(同let)
3.不能重复申明(同let)
{
const str1 = 'lucy';
const str1 = 'bob';
console.log(str1);//error: Identifier 'str1' has already been declared
}
4.申明的常量必须赋值
{
let str2;
str2 = 'bob';
console.log(str2);//bob
}
{
const str3;
str3 = 'lucy';
console.log(str3);//error: Missing initializer in const declaration
}
//问题(常量一般不容许重赋值)
{
const name = 'cc';
name = 'bb';
console.log(name);//error: Missing initializer in const declaration
}
//解决
{
const obj = {name: 'cc'};
console.log(obj);//{name: "cc"}
obj.name = 'bb';
console.log(obj);//{name: "bb"}
}