第一天
1.let和var区别:
es6中新引入一个定义变量的关键字:let。
不同点:let定义的变量只在该命令的代码块里有效,而var在定义命令块外也同养有效。
let : 适用于for循环中;不存在变量提升(const也不存在变量提升),不允许在相同作用域内重复声明同一个变量,必须先定义后使用不然会报错,在某一个块级区域内存在暂时性死区,即:
let temp = 2;
{
temp = 'aa';
let temp;
}
//会报错,此时花括号内的temp相当于还未定义过(const也有该性质)
var : 适用于全局变量,存在变量提升,即可以先使用后定义
{
let temp = 2;
}
//上面的temp只在花括号内有效
{
var temp = 2;
}
//此时的temp在花括号外面同样有效
const :定义常量,一旦定义之后该值将不能被改变,和let一样不存在变量提升,在某一个块级区域内也存在暂时性死区。constconst实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动,所以定义对象之后不能在把其他的对象赋值给该对象
onst foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
const a = 12;
//从此a的值不能为改变
const a; //会报错,const一旦定义之后就得赋值,只定义不赋值会报错
某些隐藏性死区:
function bar(x = y, y = 2) {
return [x, y];
}
bar(); // 报错,此时形参中的x默认等于y,但是y并未声名定义
function bar(x = 2, y = x) {
return [x, y];
}
bar(); // 结果[2, 2],此时的x先定义为2,在赋值给y
注意点:按照严格规定来讲let和函数必须要定义在块级作用域的顶层。顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象,为了统一规定在所有的环境下this都是顶层对象.