ES6新增关键字let和const,用来定义变量;
1,关键字let的特点:声明块级作用域变量;不允许多次声明同一个变量;不存在变量声明提升;块级作用域下使用let或const命令或形成一个作用域封闭去(暂时性死区)即不允许变量在声明前使用;for语句上声明的变量与上一次声明的变量不是同一个,即for语句上声明的变量是局部变量,不是全局变量;
let关键字的使用:
//不能重复定义同一个变量---------
var hello = 'hixi';
var hello = 'ed';
let test = 'for test';
let test = 'hello'; //Script snippet %234:4 Uncaught SyntaxError:
//Identifier 'test' has already been declared
//在for语句上的变量声明;let声明的i是个作用于for块级的变量,每次遍历,i都是一个新的遍历-------
//执行完for的块级代码后变量i会被销毁,但是它被setTimeout的回调函数引用,因此变量i还保存在内存中
//这相当于闭包函数;
//for(var i = 0; i< 3; i++){
// (function(i){
// //i被闭包引用,i按现在的值被保存在内存中,直到在引用的代码逻辑执行完毕
// setTimeout(()=> console.log(i), 1);
// })(i);
//}
for(let i = 0; i< 3; i++){
//块级作用域,每次执行,都是不同的块级作用域;
setTimeout(() => console.log(i), 1);
}
console.log(i);//Uncaught ReferenceError: i is not defined
//j是全局变量;
let j;
for( j=0; j<3; j++){
setTimeout(() =>{
console.log(j);
}, 1);
}
console.log(j);
//3
//3 x3 //3次都输出3,只因为j是全局变量,就跟var在for语句定义一样;
//setTimeout引用的j是全局变量,自然而然地是用到变量最后的结果;
//块级作用域下的变量--------------------
let outVar = 4;
if(true){
//块级作用域,要求变量未声明前不可用;
//虽然在全局已有个outVar且该条语句在变量声明前,但在块级中,既有定义同名的块级变量,规定使用的是块级的,
console.log(outVar);
//Uncaught ReferenceError: Cannot access 'outVar' before initialization
let outVar = 9;
}
//如果是下面这样就不会有这种问题
//因为这里outVar是全局已经定义的变量
if(true){
console.log(outVar);
//4
let innerVar = 9;
}
2,const的特点:不允许声明已存在的变量或多次声明同一个变量;不允许修改constbianl的值(引用类型的值比较特殊,会被改动);声明块级作用域变量且块级作用域会形成一个封闭去;const保护数据不变的实质是保护变量指向的内存地址所保存的数据不被改变,若变量是引用对象,则内存地址保存的是指向实际数据的指针而不是实际的数据,所以const只保证指针的指向不变不能保证数据不变;
const的使用:
//常量被要求在定义
// console.log(KI);//自然的变量声明提升机制就不适用于常量的定义了
// //Uncaught ReferenceError: Cannot access 'KI' before initialization
// const KI; //未声明
// //Uncaught SyntaxError: Missing initializer in const declaration
const KI = 690;
// const KI = 450; //不能重复声明
// //Uncaught SyntaxError: Identifier 'KI' has already been declared
// KI = 790; //不能修改值
// //Uncaught TypeError: Assignment to constant variable.
const constObj = {a: 'hi', b: 'test'};
// constObj = {}; //这样不行
// //ncaught TypeError: Assignment to constant variable.
constObj.a = 'hahahihi'; //这样可行;
console.log(constObj);
//{a: 'hahahihi', b: 'test'}
if(true){
const u = 'UI';
console.log(u);
//'UI'
}
console.log(u);
//Script snippet %234:23 Uncaught ReferenceError: u is not defined
3, 参考文档:
ES6引入了let和const关键字,用于声明变量。let具备块级作用域,不允许重复声明,并存在暂时性死区。在for循环中,let声明的变量为局部变量。const同样具有块级作用域,但一旦声明便不可更改,对于引用类型,const保护的是引用地址,而非实际数据。了解let和const的使用,能更好地管理变量。

6835

被折叠的 条评论
为什么被折叠?



