异步 & 事件循环
-
宏任务队列(setTimeout)、微任务队列(then、process.nextTick()),每轮事件循环找到宏任务,宏任务执行完后,执行微任务
-
在
new Promise
中调用resolve
或reject
或 返回一个 Promise 才可以执行 then,then 的 return 值会被包装成 Promise 对象 -
输出的样子
-
then方法接受的参数是函数,而如果传递的并非是一个函数,它实际上会将其解释为then(null),这就会导致前一个Promise的结果会传递下面
-
throw new Error(‘error!!!’) 或 reject(“error!!!”)
会输出
Uncaught (in promise) Error: error!!!
- .then 或 .catch 返回的值不能是 promise 本身,否则会造成死循环
- 每一次 .then 都会在下一轮微任务执行,.then.then… 是很多轮微任务
- 在 Promise 中抛出错误会被 catch 捕获或 Then 第二个参数
async await
- 停止执行 async 区域中 await 后的代码被阻塞,之后跳出 async 区域,会继续执行执行后面的同步代码,如果 async 区域中没有 await,异步代码执行方式,如果 wait 后面是 Promise,那这个 Promise 如果是 pending/reject 状态,await 后面的代码不会继续执行。如果这个错误被捕获了,那么后面的可以正常输出
await Promise.reject('error!!!').catch(e => console.log(e))
- 如果 async 中的 return 会被包装成 Promise
this
- this 指向跟调用无关,跟所处位置有关
- 箭头函数是不绑定this的,它的this来自原其父级所处的上下文,对象不构成单独的作用域【function 构成独立作用域】,所以箭头的函数的this就指向了全局作用域window
- 严格模式【
'use strict';
】 this 的值不会为 window - 每个 function 都会有自己独立的上下文,根上下文的 this 是 window,根据调用方式初始化每个作用域中的this值,如果没有就是 window
- this绑定的优先级:new绑定 > 显式绑定【var bar = foo.call(obj2)】 > 隐式绑定 【obj1.foo()】> 默认绑定【window】
作用域&变量提升&闭包
- var x = y = 1; 实际上这里是从右往左执行的,首先执行y = 1,然后第二步是将y赋值给x
- 如果没有赋值是 undefined,如果没有定义【Uncaught ReferenceError: x is not defined】
- Function 和 var 都会被提升(变量提升)
- js中变量的作用域链与定义时的环境有关,与执行时无关
原型&继承
- var F = function() {}; var f = new F();
f 原型是 Object,F 是 Function 的实例