1.
var count = 30;
if(count) {
let count=11;
console.log("里面的"+count); ///11
}
console.log("外面的"+count); ///30
var,const,let
Var定义的变量会被提升到作用域顶部,const和let不会被提升(同个代码块中,声明在下面,上面调用就会造成临时死期错误(tdz)。不同代码块外,不会出现临时死期)
1、const定义的变量不能在被修改,但定义的对象可以修改对象里面属性的值
2、 let定义的变量可以在被修改
2.
变量使用var
var funcs = [];
for(var i=0;i<10;i++){
funcs.push(()=>{
console.log(i);
})
}
funcs.forEach((func)=>{
console.log(i);///这里的i都是10
console.log("fun"+func); ///这里输出的是10个function
func(); /// 就会输出10个10
})
变量使用let
var funcs = [];
for(let i=0;i<10;i++){
funcs.push(()=>{
console.log(i);
})
}
//forEach 是es5的写法(使用foreach遍历数组的话,使用break不能中断循环,使用return也不能返回到外层函数。)
funcs.forEach((func)=>{
console.log(i);///这句是会报错的,i不在此取到
console.log("fun"+func); ///这里输出的是0-9的个function
func(); /// 就会输出0-9
})
变量使用const,第一次迭代不会报错,但是第二次迭代就会出错
3. in 、(for in获取的值是索引) (for of获取的值是数组的值)
要取对象中的属性,就可以引用in
for in更适合遍历对象,不要使用for in遍历数组
///用for of遍历数组
object = {
a: true,
b: true,
c :true
};
//这里可以定义key是let,也可以用consr来定义const。(因为他这里是每次都是创建一个新的绑定)
for(let key in object){
console.log(key); // a b c
}
ES5的Object.keys(myObject)获取对象的实例属性
Object.keys(object1).forEach((key,index)=>{
console.log(key,object1[key]); // a true,b true, c true
})
4. 全局对象跟定义的数据 var 定义的变量,会覆盖全局的window的变量。
///这种情况常见于在浏览器中跨iframe或者跨window访问代码时用到
var RegExP ='HELLO'
window.RegExP == RegExP ;
但是如果是let或者const
let RegExP ='HELLO' /// 不想改变全局对象
window.RegExP != RegExP ;
而const和let定义的变量,是在全局下新增一个新的绑定