1.let :let声明的变量只在let命令所在的代码块内有效。
if(true){
let a =1;
var b = 2;
}
console.log(a);//ReferenceError: a is not defined
console.log(b);//2
案例:
1)var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); //10
a[9](); //10
2)var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); //6
a[9](); //9
3)for循环,设置循环变量的部分是父作用域,循环内部是一个单独的子作用域
for(let i=0;i<3;i++){
let i='abc';
console.log(i);
}// abc// abc// abc
let声明的变量不存在变量提升
暂时性死区:在代码块内,使用let命令声明变量之前,该变量都是不可用的。
let不允许在相同作用域内,重复声明同一个变量。
ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。
function f(){console.log('I am outside!');}
(function(){
if(false){
// 重复声明一次函数f
function f(){console.log('I am inside!');}
}
f();
}()); //I am outside! ES5环境中 I am inside!
ES6 的块级作用域必须有大括号
2.const :声明一个只读的常量。一旦声明,常量的值就不能改变。
const a =1;
a //1
a=2; //报错
const b; //报错
const和let相同,只在声明所在的块级作用域内有效。
const a=[];
a=['1'] //"a" is read-only
3.顶层对象的属性 :在浏览器环境指的是window对象,在 Node 指的是global对象。
let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。
网友评论