// 块状作用域functiontest2(){var a =3if(a ===3){var b =4let c =5
console.log('abc')}else{
console.log('cba')}// 在es6之前只有全局作用域和局部作用域,故使用var定义的变量其实就是局部作用域中的数据值,故可以访问
console.log(b)// 可以输出b的值// 使用let或const定义块级作用域变量
console.log(c)// 无法输出c的值return a +4}
console.log(test2())
// let与const{let a =1;
console.log(a);// 输出1}
console.log(a)// 无法输出结果,因为let具有块状作用域// 使用var定义的变量可以通过window来访问,使用let定义的变量无法通过window来访问var b =3;let c =4;
console.log(b, c);// 输出 3 4
console.log(window.b, window.c);// 输出 3 undefined// var定义的变量可以重复定义,相当于覆盖之前定义的变量值 / let定义的变量不可以重复定义var b =4let c =5
console.log(b)// 输出4
console.log(c)// 无法输出结果, let定义的变量无法进行重复定义// let定义的变量不会进行变量提升// let的特性,const都具备,且const只能定义常量const a =2
a =3// 报错,因为const的常量不能被修改
console.log(a)// const不能在定义时不赋值,但是let和var都可以const b
b =3// 报错
console.log(b)
总结
使用var定义的变量可以通过window来访问,使用let定义的变量无法通过window来访问
var定义的变量可以重复定义,相当于覆盖之前定义的变量值 / let定义的变量不可以重复定义
let定义的变量不会进行变量提升
let的特性,const都具备,且const只能定义常量
const不能在定义时不赋值,但是let和var都可以
常考面试题
// 课后练习// 面试题1: 请说出console输出的结果
console.log(a);let a =1;// 报错 Cannot access 'a' before initializationvar a =1;// 报错 a is not defined
a =1;// 输出 undefined// 面试题2: 请说出console输出的结果let array =[1,2,3];for(let i =0; i < array.length; i++){setTimeout(()=>{
console.log(array[i]);},1000);}// 输出结果 1 2 3