tip: 默认使用const,实在需要变量再使用let
var声明变量的提升机制:
//js在编译时会将方法里的变量预加载 ,提升到顶级
function getValue(condition){
if(condition){
var value='blue';
return value;
}else{
console.info(value);
//这里可以访问value :undefined
return null;
}
//这里可以访问value :undefined
}
getValue();
//实际上
function getValue(condition){
var value;
if(condition){
value='blue';
return value;
}else{
console.info(value);
//这里可以访问value :undefined
return null;
}
//这里可以访问value :undefined
}
块级声明:
let声明:
动态
和var无缝,禁止了提升机制
在重复定义时抛出异常
const声明:
静态
必须初始化 const name; //错误 未初始化常量
不能重复声明
const 变量不能修改绑定 但是可以修改绑定的属性值
const sta='ccc';
sta='bbb';
//- Assignment to constant variable. 分配常数变量
const a={
name:'aaaa'
};
console.info(a);
a.name="ccc";
console.info(a);
//没问题
let和const在未声明前调用会出现临时死区 基本用不到
循环中块级作用域的绑定:
在循环中的var i会提升到循环外
for(var i=0;i<10;i++){
}
console.info(i);
//10
for(let i=0;i<10;i++){
}
console.info(i);
// i is not defined
循环中的作用域绑定:
var arr=[];
(function (arr){
for(var i=0;i<10;i++){
arr.push(
function (){
return i;
}
);
}
})(arr);
arr.forEach(function (i){
console.info(i());
})
//1010101010101001
原始解决方案:
var arr=[];
(function (arr){
for(var i=0;i<10;i++){
arr.push(
( //快速执行函数
function (value){
return function (){
return value;
};
}(i)
)
);
}
})(arr);
arr.forEach(function (i){
console.info(i());
})
//0123456789
将var替换为let则没有这种问题
for循环中不能修改的常量也可以使用const
如 for in forEach数组或者对象可以直接用
var 定义在首层时会将变量设置到window上
var a='aaa';
console.info(window.a);
而let或const创建的不会