js垃圾回收机制
内存泄漏
由于疏忽或错误造成程序未能释放那些已经不再使用的内存,造成内存的浪费。
垃圾收集机制的原理
垃圾收集器会周期性的找出不再使用的变量,然后释放占用的内存
回收方式
1.标记清除
当变量进入环境后会被标记为进入环境,当离开环境时会被标记为离开环境
2.引入计数
当变量声明第一次赋值时,将贮存这个值的内存记为1,当值改变时,原先内存就记录为0。改变后的值又贮存在新的内存里,当前赋值为1。回收技术为0的
闭包
可以说是子函数调用父元素的一种现象。是指有权访问另一个函数作用域中的变量的函数。之所以能够访问另一个函数作用域中的变量的函数,是有内部函数的作用域链中包含另一个函数的作用域。闭包是可以用let来解决。因为let可以生成块级作用域。
事件委托
通过事件冒泡的原理实现。具体是给父级元素做事件处理,对子元素做了操作后会冒泡到父元素,然后触发父元素绑定的事件。
优化:event对象提供了target属性,可以返回事件的目标节点,获得当前节点的位置。
js异步函数
异步函数也称为“asynac/await”(语法关键字),这个特性让以同步方式写的代码能够异步执行
1.promise
promise对象是一个构造函数,表示一个异步操作的最终完成(或失败)及其结果值。
一个promise的三种状态:pending(待定),已兑现(fulfilled),已拒绝(rejected)。如果一个 promise 已经被兑现或被拒绝,那么我们也可以说它处于 已敲定(settled) 状态。你还会听到一个经常跟 promise 一起使用的术语:已决议(resolved),它表示 promise 已经处于已敲定状态,或者为了匹配另一个 promise 的状态被“锁定”了。
Promise的调用:Promise.prototype.then()、Promise.prototype.catch() 和 Promise.prototype.finally()
例如 .then() 方法需要两个参数,第一个参数作为处理已兑现状态的回调函数,而第二个参数则作为处理已拒绝状态的回调函数。每一个 .then() 方法还会返回一个新生成的 promise 对象,这个对象可被用作链式调用,就像这样
const myPromise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('foo');
}, 300);
});
myPromise
.then(handleResolvedA, handleRejectedA)
.then(handleResolvedB, handleRejectedB)
.then(handleResolvedC, handleRejectedC);
2.await
await 表达式会暂停当前 async function 的执行,等待 Promise 处理完成。若 Promise 正常处理 (fulfilled),其回调的 resolve 函数参数作为 await 表达式的值,继续执行 async function。若 Promise 处理异常 (rejected),await 表达式会把 Promise 的异常原因抛出。另外,如果 await 操作符后的表达式的值不是一个 Promise,则返回该值本身。
如果一个 Promise 被传递给一个 await 操作符,await 将等待 Promise 正常处理完成并返回其处理结果。
function resolveAfter2Seconds(x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x);
}, 2000);
});
}
async function f1() {
var x = await resolveAfter2Seconds(10);
console.log(x); // 10
}
f1();
如果该值不是一个 Promise,await 会把该值转换为已正常处理的 Promise,然后等待其处理结果。
async function f2() {
var y = await 20;
console.log(y); // 20
}
f2();
如果 Promise 处理异常,则异常值被抛出。
async function f3() {
try {
var z = await Promise.reject(30);
} catch (e) {
console.log(e); // 30
}
}
f3();