1 声明
// es5 var function 可以提升变量
// es6 let count 没有变量提升
// import class 模块化开发 类
var a;
if (true) {
var b = 123;
}
for (var i = 0; i < 12; i++) {
var data = 123;
}
function foo() {
var bar = 123;
}
// 问题:哪些是全局变量 哪些是局部变量
// 全局:a data b i
// 局部:bar
变量使用的规则
let var function const import class
1:由let const 声明的变量在【同一作用域】下不能存在重复声明的变量(可以为任意六种声明方式之一)
否则会出bug:Identifier ‘a’ has already been declared(意味当前作用域变量重复声明)
2:es6 中let const 声明的变量不存在变量提升
bug:Cannot access ‘b’ before initialization;
----> 换句话:不声明不能用
3:const声明的变量不能被修改,let 为变量
bug:Assignment to constant variable.
const c = 123;
c = 456
console.log(c); // bug:Uncaught TypeError: Assignment to constant variable
4:注意:当const赋值为引用数据类型。可以修改引用数据类型
const obj = {
a: 1231
};
obj.a = '456';
console.log(obj); // {a: "456"}
//obj = {}; // 修改了 obj 常量的指针
const声明的常量,不能被重新赋值,为什么对象或者数组中的内容被修改了???
当const赋值为引用数据类型的时候,保证的const变量 保存的地址不变,不能保证地址中存放数据是否发生变化。
5:es6让typeof 不再100% 正确.不会报错
6:在同一作用域中,在声明变量之前使用变量,该区域为暂时性死区。
注意:
- 不是一个特定区域,指的是 在当前作用域下声明的变量,在该作用域中那里不能使用。
- 根据变量的声明范围与使用范围确定的区域。
- 在暂时性死区中 typeof不再100%准确。
怎么找暂时性死区?
- 找let const
- 找let const 变量的作用域
- 在当前作用域中,声明之前,不能使用letconst变量定位区域为展示性死区
暂时性死区特点:
- 使用变量报错
- typeof 不能100%正确
暂时性死区怎么形成的?
- es6 中let const 声明的变量没有变量提升
块级作用域
1 let const 声明的变量形成了块级作用域
什么是块级作用域 ?
- 块级作用域:let const 声明的变量,在哪里能够访问?
- 哪里==>块级作用域
如何查找块级作用域 ?
- 看声明变量的方式:是不是let const
- 找包裹该变量的代码块{}
- 特殊的:for if else
let a = 123; {
let a = 456;
}
console.log(a);==>123
if (true) {
let b = '123';
console.log(b);//123
}
// 为什么会报错?
console.log(b);//Uncaught ReferenceError: b is not defined
2 特殊的for循环
for (var i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i); //===>三个3
}, 16.7);
}
for (var i = 0; i < 3; i++) {
(function (i){
console.log(k); // 0 1 2
}(k))
}
//for 中let i 在执行的时候,会执行多个块级作用域
//每个块中,彼此独立,每个i中都有初始值.
for (let i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i); //===>0 1 2
}, 16.7);
}
// 到底生成了几个i变量?
// 只有一个
// 为什么输出结果是 0 1 2 而不是 3 3 3
// 因为for循环执行多次,i会产生多个块级作用域,每个之间彼此独立,都有初始值
// 所以:setTimeOut 执行时候,访问的是自己块中的赋值. 0 1 2