一.JavaScript垃圾回收机制
垃圾回收机制:执行环境负责管理代码执行过程中使用的内存。JS的垃圾回收机制是为了以防内存泄漏,内存泄漏的含义就是当已经不需要某块内存时这块内存还存在着,没有被释放,导致该内存无法被使用,垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。
let obj = {} // 开辟内存
obj.name = 'haha' // 标记内存
obj = null // 释放内存
- 标记清理 :
垃圾回收器在运行的时候会给存储在内存中的所有变量都加上标记,垃圾收集器完成内存清除工作,销毁那些带标记的值,并回收他们所占用的内存空间。
- 引用计数
当声明一个变量并将一个引用类型赋值给该变量时该值引用次数加1,而在不使用这个类型的时候就会减一,知道减到0为止.
二.闭包
1. 闭包说的通俗一点就函数外部访问函数内部的变量,在正常情况下函数外部是访问不到函数内部作用域变量的,作用域分为:全局作用域和局部作用域
全局作用域:是在全局作用域下声明的变量叫做全局变量,全局变量在全局(代码的任何位置)下都可以使用;全局作用域中无法访问到局部作用域的中的变量
局部作用域:对于javaScript中函数后面的{ } (注意:是函数后面紧跟着的{ })中的作用域,就称之为局部作用域。而这个局部作用域内声明的变量,就只能在它这个作用域内才能使用了。
2. 如何判断是不是闭包呢? 我的方法就是 看一个函数里面是否存在另一个函数 内部函数被return,内层函数调用外层函数的局部变量
闭包的优点: 可以隔离作用域,不造成环境污染,可以让垃圾回收机制不会回收这个变量,让他能一直被标记为被引用。
闭包的缺点: 由于闭包长期的驻留内存,则长期这样会导致内存泄露.
如何释放内存:将暴露在外部的闭包变量置为null
function A() {
let a = 1
window.B = function () {
console.log(a)
}
}
A()
B() // 1
三. var let 和 const的区别
1.var 的变量会挂载到 windows上 而let 和 const不会
var a = 1 // window.a
console.log(a); // 1
console.log(window.a); // 1
let b = 2; //
console.log(b); // 2
console.log(window.b); // undefined
const c = 3; //
console.log(b); // 3
console.log(window.b); // undefined
2.var 的变量可以 重复声明而 let 和 const 不会重复声明 如果声明会报错
var a = 1;
var a = 100;
console.log(a) // 100
let b = 2 ;
let b = 200 ;
// Uncaught SyntaxError: Identifier 'b' has already been declared
let const = 3 ;
let const = 300 ;
// Uncaught SyntaxError: Identifier 'c' has already been declared
3. var 有变量提升 let 和const 没有变量提升
console.log(a) // undefined
var a = 10;
console.log(b)
let b = 20;
//Uncaught ReferenceError: can't access lexical declaration 'b' before initialization
console.log(c)
let c = 20;
//Uncaught ReferenceError: can't access lexical declaration 'c' before initialization
let 和 const 含有块级作用域也会形成暂时性死区
// let const 生成块级作用域
if(1){
var a = 100;
let b = 10
console.log(b)
}
function fn(){
return {
a:100
}
}
fn()
console.log(a);
console.log(b)
var a = 100
function fn(){
console.log(a);
let a = 10;
}
fn(); // 暂时性死区
四.同步和异步的理解
同步就可以说代码是从上往下来执行的。异步可以认为成有些代码是并行
执行吧,耗时的任务。不会阻塞后面代码的执行。
异步的主要解决方式(三种):
1. 回调函数
2. promise
3. generator
4. async 和 await
五.微任务和宏任务的理解
promise 和 setTimeout 谁先执行
这里面的执行.是牵扯到一个微任务宏任务的执行顺序的问题.像 setTimeout
setInterval 都是宏任务的。
目录
promise.then.catch 是微任务的,当这个任务执行的时候,会先
执行宏任务里面的代码,然后在执行宏任务中微任务的代码.只有当前宏任务执行完毕,才会
去执行下一个宏任务.