声明方式:
let const 声明将替代原来的 var
作用域分为:
1.函数作用域
2.全局作用域
实例:
for(var i = 0;i<3;i++){
console.log(i)
}
console.log(i); //输出 3
console.log(window.i); //输出 3
//题解:
由于var不支持封闭作用域,会直接声明到全局作用域上
for循环不是个函数作用域,所以i以全局作用显示
//原始解决不挂载全局方法
(function (){
for(var i = 0;i<3;i++){
console.log(i)
}
console.log(i); //i is not defined
console.log(window.i);
})()
//es6的解决方法
//let和{}配合可以产生一个作用域
for(let i = 0;i<3;i++){
console.log(i)
}
console.log(i); //i is not defined
console.log(window.i);
for(var i = 0;i<3;i++){
setTimeout(function(){
console.log(i) //输出3 3 3
})
}
//题解:
由于setTimeout为异步队列,先执行同步后执行异步,所以执行为for循环才会执行setTimeout,此时的并没有保存每次的i值,故取得是全局i
//原始解决方法
for(var i = 0;i<3;i++){
(function(i){
setTimeout(function(){
console.log(i) //输出3 3 3
})
})(i)//保存了当前函数i
}
//es6解决方法
let支持块级作用域,声明的变量总会声明在当前作用域
for(let i = 0;i<3;i++){
setTimeout(function(){
console.log(i) //输出3 3 3
})
}
es6声明好处:
1.解决作用域污染问题和局部作用域的问题
如:实例一
2.解决在同一个作用域下重复声明
var a = 1;
var a = 2; //ok, a = 2
----------------------
let a = 1;
let a = 2; //no,报错
-----------------------
let a = 1;
var a = 2;//no,报错
-----------------------
let a =1;
function aa(){
let a = 2; //ok,两个a的作用域不同
}
3.不支持域解释问题【变量提升】
console.log (a); //undefined,声明未赋值
var a = 1;
---------------------------------------
console.log (a); //a is not defined,未声明何谈赋值
let a = 1;
const:通过const声明的变量不能被修改,不能被修改引用空间
const a = 1;
a = 2; //no,常量不可修改
--------------------------------------
const a = {name:"小明"}
a.age = 9
console.log(a); //{name:"小明",age:9}