闭包是指在 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)