0
点赞
收藏
分享

微信扫一扫

前端面试必问题

何以至千里 2022-04-23 阅读 53

一.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 都是宏任务的。

目录

一.JavaScript垃圾回收机制

二.闭包 

三. var let 和 const的区别 

四.同步和异步的理解

五.微任务和宏任务的理解 


promise.then.catch 是微任务的,当这个任务执行的时候,会先
执行宏任务里面的代码,然后在执行宏任务中微任务的代码.只有当前宏任务执行完毕,才会
去执行下一个宏任务.

 

举报

相关推荐

0 条评论