JavaScript中的闭包

90 阅读1分钟

闭包是指在 JavaScript 中,一个函数可以访问在其外部定义的变量和函数,即使在函数外部调用该函数时,这些变量和函数仍然可以被访问。

换句话说,当一个函数返回另一个函数时,返回的函数可以访问其父函数作用域内的变量,即使该父函数已经执行完毕并且其作用域已经销毁。这种能力被称为闭包。

例如,考虑以下代码:

function outerFunction() { 
  const outerVariable = "Hello ";   
  // 这里的innerFunction可以理解为一个背包,里面装着外层的变量或函数
  function innerFunction(name) {    
    console.log(outerVariable + name); 
  } 
  // 这里将背包返回;
  return innerFunction; 
} 
const inner = outerFunction()("World!");
console.log(inner); //"Hello World!";

在这个例子中,outerFunction 返回 innerFunction,这个函数可以访问其父函数作用域中的变量outerVariable。

当 outerFunction 调用结束后,outerVariable 应该已经销毁了,但是由于 innerFunction 中引用了 outerVariable,因此该变量仍然可以被访问。

最后,我们调用 inner 并传入参数 "World!",输出结果为 "Hello World!"。

这就是闭包的基本原理:内部函数可以访问其外部函数作用域中的变量,并保持对这些变量的引用,即使外部函数已经执行完毕。

函数缓存 memoization

function openAI(word){
  console.log(`openAI处理的${word}`);
  return `处理后的答案...`
}
function memoization(fn){
  // 声明一个持久化存储数据的变量
  const cache = {};
  // 闭包的内部函数
  return (...args)=>{
    // 如果对象中存在该数据 直接拿出 否则 进行fn处理后的结果放入cache中并返回
    if(cache[args]){
      return cache[args];
    }else{
    return   cache[args] =fn(...args); 
    }
  }
}
const chatGPT = memoization(openAI)(111)