var
定义变量
var
定义的变量挂载到window上了
var
定义变量存在的问题
var b = 6;
var b = 9;//后定义的同名key会覆盖之前的key
console.log(b)//6
for (var i = 0; i < 10; i++) {
//小括号里面的i是一个全局变量 通过var定义的变量只有函数内部的局部变量和全局变量之分,for循环if判断中定义的都是全局变量
//js的执行逻辑
//(1)在js主程序(单线程)上的同步任务形成了一个主任务执行栈
//(2)主线程之外还存在一个任务队列,这个队列存在一些按时间顺序存放的事件,如鼠标点击、计时触发等,主线程中每出现一个异步任务,任务队列就会增加一个异步任务的事件
//(3)一般执行栈中的同步任务执行完毕,系统就会读取任务队列,看看哪些事件是可以执行的,一旦可以执行将进入执行栈开始执行
//(4)不断重复以上动作
//如果真的用var,这里面就不能存在不进行特别处理的异步操作,因为for(这里面是直接在主任务执行栈上操作的){
//这里面的异步操作不在主程序栈上执行操作,需要等到主程序都执行完再执行}
(function (i) {
//这样的特殊处理
setTimeout(() => {
console.log(i);
}, 1000 * i);
})(i);
};
console.log(i);//10由于定义的是全局变量,导致污染了全局变量
if (true) {
var a = 12;//相当于定义了一个全局变量
}
console.log(a)//12
let
定义变量的特点
let
在同一个块级作用域中不能重复的定义变量
let a = 1;
let a = 2;// 在同一个块级作用域中不能重复的定义变量
console.log(a);//Identifier 'a' has already been declared
let
定义的变量没有预解析,不存在变量提升,在代码块中,只要let定义的变量,在之前调用,都是会报错的!先定义后使用!
let a = 12;
function func() {
//只要在当前的块级作用域中通过let定义了变量,那么一定会使用这个变量
console.log(a);//报错 原因没有预解析这么一说了
let a = 2;
}
func();
let
定义的变量只能在这个块级作用域中使用,外部是不能调用的
for (let i = 0; i < 10; i++) {
console.log(i)//正常打印
}
// console.log(i)//报错:找不到i
if (true) {
let a = 6;//通过let定义的变量只能在当前的代码块中调用
console.log(a)//6
}
console.log(a)//报错找不到a
for
循环,小括号中的是父级作用域而花括号中的是子集作用域
for (let i = 0; i < 3; i++) {
//小括号中的是父级作用域而花括号中是子集作用域
// console.log(i)//0/1/2;
let i = 'xbc';
console.log(i)//没有报错并且输出xbc/xbc/xbc
}
{
//父级作用域父级作用域是访问不到子集作用域中的变量的
let a = 12;
{
//子集作用域
let a = 5;
console.log('子集作用域:', a)//5
}
console.log('父级作用域:', a)//12
}
const
定义常量的特点
const
的特性和let是一样的不同的是const定义好了就不能改变了
const str = '字符串';
str = '修改字符串';
console.log(str);//Assignment to constant variable.
const
定义完变量必须有值,不能先声明后赋值
const str;//Missing initializer in const declaration
str = '常量';
console.log(str);
通过const
指定的只能是普通的,不能是引用机制的例如数组
const arr = ['apple', 'banana'];
arr.push('orange');//对象是引用机制,所以能修改缓存,要想实现彻底的常量可以用Object.freeze(对象)方法
console.log(arr);//["apple", "banana", "orange"]
const arr =Object.freeze(['apple,banana']);//冻住数组可以,但是也只能限制push/unshift/shift/pop等方法,如果数组里面放置的是对象,通过数组[index].key的方式修改,也是不行的
arr.push('orange');
console.log(arr)//Cannot add property 1, object is not extensible