进阶知识

1. 闭包 losure

1.1 定义

闭包为定义在一个函数内部的函数,其本质是将函数内部和函数外部连接起来的一座桥梁,通过闭包使外部能够访问函数内的局部变量,延伸了变量的作用范围。

// f2能够访问f1内的局部变量,因此返回f2就能在外部访问f1内的局部变量 - f2就是闭包
function f1() {
    var n = 999;
    function f2() {
        console.log(n);
    }
    return f2;
}
var result = f1();
result(); // 999

// 注意闭包返回f2与f2()的区别 - 带上括号返回的是函数调用,不带括号仅函数名返回的是函数
function f1() {
    var n = 999;
    function f2() {
        console.log(n);
    }
    return f2();
}
var result = f1(); // 999

1.2 作用

  1. 读取函数内部的变量

  2. 变量的值始终保持在内存中 - 保存变量现场

  3. 封装 - 信息隐藏

2. 事件循环机制

JavaScript 是一门单线程语言,异步操作都是放到事件循环队列里面,每次宏任务执行完毕,先去微任务队列查找是否有微任务,如果有就先完成所有的微任务,如果没有微任务或完成所有微任务则从宏任务队列中继续执行宏任务。

2.1 宏任务

分类:script 整体代码, setTimeout, setInterval, requestAnimationFrame, I/O, UI rendering

  • 宏任务所处的队列就是宏任务队列

  • 第一个宏任务队列中只有一个任务,也就是script的代码

  • 宏任务队列可以有多个

  • 当宏任务队列中的任务全部执行完毕后可以查看是否有微任务队列,如果有就先执行微任务队列中的所有任务

2.2 微任务

分类:Promise.then(), await之后的代码, process.nextTick, Object.observe, MutationObserver

  • 微任务所处的队列就是微任务队列

  • 只有一个微任务队列

  • 在上一个宏任务队列执行完毕后,如果微任务队列中有任务就会去执行微任务队列中的所有任务

3. 垃圾回收机制

4. 节流与防抖

5. 模版字符串

模版字符串的引入可以使字符串中直接嵌入变量,而不用使用'+'连接。注意模版字符串不是引号"",而是反引号````````。

模板字符串紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。

6. 函数柯里化

接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数。

如果你对内容有任何疑问,欢迎提交 ❕issues✉️ email

最后更新于

这有帮助吗?