一、问题背景
在 JavaScript 中,所有数字(除了 BigInt)都采用 IEEE 754 双精度浮点数格式存储。
这会导致许多开发者熟悉的“经典 Bug”:
0.1 + 0.2 === 0.3 // false
0.1 + 0.2 // 0.30000000000000004
2024/12/17大约 2 分钟
在 JavaScript 中,所有数字(除了 BigInt)都采用 IEEE 754 双精度浮点数格式存储。
这会导致许多开发者熟悉的“经典 Bug”:
0.1 + 0.2 === 0.3 // false
0.1 + 0.2 // 0.30000000000000004
postMessage 与创建它的主线程直接通信onmessage 接收消息js是单线程的语言,它运行在浏览器的渲染主线程中,而渲染主线程只有一个。
渲染主线程承担着诸多工作,例如解析、渲染页面、执行js都在其中,如果使用同步会极有可能产生阻塞,从而导致消息队列中许多其他任务无法得到执行,从而会造成 1.主线程白白的消耗时间、2.页面无法及时更新,产生卡死现象。
所以浏览器采用异步的方式来解决,具体做法是(事件循环)当某些任务发生时,比如计时器、网络、事件监听,主线程将其交给其他线程处理,自身继续执行后续代码。当其他线程结束后,将事先传递的回调函数包装成任务加入到消息队列末尾,等待主线程的调度执行。在这种异步模式下,浏览器永不阻塞,最大限度的保证了单线程的流畅运行。
闭包(Closure)是 JavaScript 中一个重要的概念,它允许函数访问其词法作用域(lexical scope)之外的变量。闭包是由函数和对其周围状态(词法环境)的引用共同构成的。换句话说,闭包让函数可以“记住”并访问它被创建时的作用域,即使这个函数在其作用域之外执行。
闭包的核心在于函数可以访问其外部函数的变量,即使外部函数已经执行完毕并从调用栈中移除。以下是一个简单的例子来说明闭包的概念:
function outerFunction() {
let outerVariable = "I am outside!";
function innerFunction() {
console.log(outerVariable); // 访问外部函数的变量
}
return innerFunction;
}
const closure = outerFunction();
closure(); // 输出: I am outside!
在这个例子中,innerFunction 是一个闭包,因为它可以访问 outerFunction 中的变量 outerVariable,即使 outerFunction 已经执行完毕。