# 前言

复习 ES6 部分知识

# 闭包

闭包让你可以在一个内层函数中访问到其外层函数的作用域,那么也就是函数的标识符跨作用域

# 标识符

标识符是变量名、函数名、函数的形参、对象的属性

# 实例

fn() 创建了一个局部变量 num 并且返回一个匿名函数,它没有自己的局部变量,然而它可以访问到外部函数的变量。外部函数返回内部函数,内部函数标识符要跨作用域

function fn() {
    var num = 10;
    return function () {
        return num;
    }
}
let r = fn()
console.log(r());

使用立即执行函数调用一次,外部函数把内部函数 fn() 挂载在 window 下,此时内部函数要跨作用域

; (function () {
    var num = 10;
    window.fn = function () {
        return num;
    }
})();
console.log(fn());

# 作用

保护变量,防止全局污染。形成一个简单块级作用域

# 经典面试题

我们要知道先走同步再走异步,如果此时使用 var 声明的变量是全局变量,此时循环走完后 i=5 ,所以定时器里面的结果也是 5;如果此时使用 let 声明的变量是区块变量,每次循环会形成一个块级作用域,所以结果将会是 0-4;使用函数的形参来保存每次循环的 i ,其实定时器里面跨作用域是闭包,这样我们改写后同样也能得到熟悉的 0-4

for (var i = 0; i < 5; i++) {
    setTimeout(function () {
        console.log(i);
    });
}
for (let i = 0; i < 5; i++) {
    setTimeout(function () {
        console.log(i);
    });
}
for (var i = 0; i < 5; i++) {
    function _loop(i) {
        setTimeout(function () {
            console.log(i);
        });
    };
    _loop(i);
}

# 原型、原型链

  1. 每个函数 (箭头函数除外) 都有一个 prototype 显示原型,它的值是一个对象
  2. 每个实例对象里面都有 __proto__ 隐式原型,它指向构造函数的显式原型
  3. prototype 显示原型里面的 constructor 构造器,它指向构造函数本身
  4. 原型链的查找规则是就近原则,一层层向上查找

# 构造函数的写法

  1. 构造函数命名规则是大驼峰
  2. 构造函数的属性和方法都是挂载在 this 上
  3. 构造函数没有 return
  4. 它的实例对象通过关键字 new 得到

# 实例对象的原理

  1. 创建一个空对象
  2. 把构造函数的 this 指向这个空对象
  3. 执行构造函数,给这个对象添加属性和方法
  4. 把上面这个对象返回

# 原型链图

意思到了就行了

查看图片

# 异步和单线程

常见的异步:定时器、Ajax、回调函数、事件处理函数

平常经常会写出层层嵌套代码形成回调地狱

# Promise

Promise 对象用于表示一个异步操作的最终完成 (或失败) 及其结果值

new Promise(resolve => {
    console.log(1)
    setTimeout(function () {
        console.log(2)
        resolve()
    }, 3000)
}).then(data => console.log(3))

# Axios

axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中

axios.get("./serve/a.json").then(res => axios.get("./serve/b.json?id=" + res.data.id)).then(res => axios.get("./serve/c.json?code=" + res.data.code)).then(res => console.log(res.data))

# Async

async 函数是使用 async 关键字声明的函数 , asyncawait 关键字让我们可以用一种更简洁的方式写出基于 Promise 的异步行为,而无需刻意地链式调用

function setTime() {
    return new Promise(resolve => {
        setTimeout(function () {
            console.log(2)
            resolve("success")
        }, 1000)
    })
}
async function consoleLog() {
    console.log(1);
    let res = await setTime();
    console.log(res);
    console.log(3);
}
consoleLog()
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

山河 微信支付

微信支付

山河 支付宝

支付宝

山河 贝宝

贝宝