Skip to content

javascript

仲灏2022-05-31约 1 分钟

<div style="display: none;" hidden="true" aria-hidden="true" data-nosnippet>Are you an LLM? You can read better optimized documentation at /pages/3d6262.md for this page in Markdown format</div>

闭包

https://juejin.cn/post/6844903858636849159

示例:

js
/*
 * @Author: 仲灏<izhaong@outlook.com>🌶🌶🌶
 * @Date: 2022-05-31 23:07:12
 * @LastEditTime: 2022-05-31 23:07:15
 * @LastEditors: 仲灏<izhaong@outlook.com>🌶🌶🌶
 * @Description:
 * @FilePath: /question100/src/javascript/闭包.js
 */
function createCounter() {
    let counter = 5;
    const myFunction = function () {
        counter = counter + 1;
        return counter;
    };
    return myFunction;
}
const increment = createCounter();
const c1 = increment();
const c2 = increment();
const c3 = increment();
console.log('example increment', c1, c2, c3); // example increment 6 7 8

它是这样工作的,无论何时声明新函数并将其赋值给变量,都要存储函数定义和闭包。闭包包含在函数创建时作用域中的所有变量,它类似于背包。函数定义附带一个小背包,它的包中存储了函数定义创建时作用域中的所有变量。

示例:

js
let c = 4
const addX = x => n => n + x
const addThree = addX(3)
let d = addThree(c)
console.log('example partial application', d) //  example partial application 7

x 就是闭包中的变量

总结:

  • 函数都具有闭包 (全局函数的闭包在全局作用域中, 体现不出, 在函数返回函数中尤为明显)

简单来说就是上级作用域内变量的生命周期,因为被下级作用域内引用,而没有被释放。就导致上级作用域内的变量,等到下级作用域执行完以后才正常得到释放。

精度问题

0.1 + 0.2 !== 0.3

  • 计算机使用二进制存储数据
  • 整数转换二进制没有误差,如9 转换为二进制是 1001
  • 而小数可能无法用二进制准确表达,如0.2 转换为1.1001100...

原型&原型链