1.var声明
var是es5的关键词
var abc = 'Hello, world';
abcd = "abcd";
var一个变量,系统就会再当前作用域的第一行代码隐式的声明一个变量(提升)
如果没有var,声明系统帮你创建一个(全局)变量(运行到这里的时候)
var aa = 0;
bb = 1;
console.log(delete aa)//false
console.log(delete bb) // true
-
有var,不可以使用delete。无var,可以使用delete。
ps :delete 是 js 用于删除对象属性和数组元素的,但有var声明的无论是全局变量还是局部变量都不能使用delete(这种属性的configurable=false)。
-
严格模式下,使用没有var声明的变量会报错。
var 变量提升
变量的提升是指会把变量的声明提升到前面,但是不提升变量赋值;
alert(a); // Uncaught ReferenceError: a is not defined a = 100;
alert(b); // undefined var b = 200;
第二段代码,var声明的全局变量b 在js中会进行代码提升,也就是说var b = 200; 会被分解为 var b;b=200; 代码解析的第时候会将var b; 提升到最前面,并且在内存中开辟一个空间,由于b没有被赋值,默认为undefined。
第一段代码中当js 执行alert() 函数时候由于没有进行var声明,变量没有被提升,不存在内存开辟,所以在alert时候直接报错。
– 解释器在执行js代码的时候,会把所有的声明,包括变量和函数的声明,提到最前面;
– 变量的提升本质上是声明的提升。
2. let 声明
ES6新增加了两个重要的 JavaScript 关键字: let 和 const。
let 声明的变量只在 let 命令所在的代码块内有效(块级作用域、局部作用),ES6 推荐在函数中使用 let 定义变量,而非 var。
1.不存在变量提升
// console.log(a1);//报错 在初始化之前不能访问a1
let a1 = "66666";
2.不允许重复声明
let a2 = 666666;
// var a2 = "hello";
console.log(a2);//报错 已存在标识符a2
3.块级作用域:花括号括起来 let声明变量
{
// 在这个块级作用域中声明的变量只能在声明内部使用
let a3 = "黄色作用域中的a3";
console.log(a3);
{
// let a3 = "紫色作用域中的a3";
console.log(a3);
}
}
4.暂时性死区:块级作用域中已经声明了,变量就会绑定在这个区域
let a4 = "这是外层作用域中的a4"; {
// console.log(a4); 报错
let a4 = "这个块级作用域中的a4";
}
例:
if (true) {
// 暂时性死区开始
// tmp = 'abc'; // 报错
// console.log(tmp); // 报错
// 暂时性死区结束
let tmp; //
console.log(tmp); //undefined
tmp = 123;
console.log(tmp); //123
}
5.let声明不存在变量提升
console.log(typeof cc); //"undefiend"
var cc;
// console.log(typeof c1); //报错
let c1;
6.形参赋值
// 给形参赋值,es6的写法,形参相当于用let声明
function bar(x = y, y = 2) {
let x = y; let y = 2;
return [x, y];
}
3. const声明变量
// const关键字声明变量,声明必须初始化,值不能被修改
const a = 123;
const a7 = 100;
// a7 = "yyyyyyy";
console.log(a7);
let a8 = 100;
a8 = "555";
console.log(a8);
1.不存在变量提升
// console.log(a1); //报错 在初始化之前不能使用a1
const a1 = "hello666";
2.不允许重复声明
const a2 = 111;
// let a2 = 222; //报错 a2已经被声明
// var a2 = 333; //报错 a2已经被声明
console.log(a2);
3.声明了变量必须赋值(变量必须初始化)
// const a3;
// console.log(a3);//报错
let a4;
console.log(a4);//undefinde
4.const声明的变量会存在块级作用域
const会有作用域链
{
const a5 = 6666;
if (true) {
// const a5 = 7777;
console.log(a5);//6666 //因为自己的块级里面已经被注释找上个块级作用域
}
}
// console.log(a5); //报错
5.暂时性死区
const也会有暂时性死区
{
// console.log(a6);//报错
const a6 = "hello";
}