使用闭包进行 JavaScript 内存优化(案例研究)
JavaScript 中,除了函数是“一等公民”之外,还有很多其他特性,让函数可以发挥更大的作用。闭包就是其中之一。
什么是闭包?
闭包是将函数与其周围状态(词法环境)的引用捆绑在一起(封闭)的组合
。Mozilla
让我们举个例子:
function adder(a) {
return function(b) {
return a + b;
};
}
let add5 = adder(5);
let add10 = adder(10);
console.log(add5(2)); // 7
console.log(add10(2)); // 12
从上面的代码中,我们清楚地了解了闭包是如何工作的,以及它是如何记住函数声明时的词法作用域的。但这究竟有什么用呢?或者这只是 JavaScript 面试中一些不太实用的问题?
别担心,JavaScript 生态系统中闭包的应用和用法已经非常丰富。今天,我们想讨论的是如何使用闭包来优化内存使用。请考虑以下代码:
function multiply(y){
let x = Math.pow(10,10);
return x* y;
}
multiply(25); //250000000000
multiply(45); //450000000000
它看起来很简单,对吧?...不,实际上,如果您注意到每次调用multiply()函数时, let x = Math.pow(10,10)都会重新创建并占用一定的内存,在这种情况下肯定会占用相当大的内存,因为它生成的数值很大。
结束
如果我们能够只创建一次let x = Math.pow(10,10); ,就像在multiply()函数调用中重复执行一样,这时闭包就派上用场了。让我们看一下下面修改后的代码:
function multiply(){
let x = Math.pow(10,10);
return function(y){
return x* y;
}
}
let multiplier= multiply();
multiplier(25); //250000000000
multiplier(45); //450000000000
这里我们引入了返回一个内部函数,它会创建一个闭包,这样每次调用multiplier()时就无需重新创建let x = Math.pow(10,10);,从而避免了过多的内存泄漏。这告诉我们,通过使用闭包,我们可以轻松避免耗费内存的作业。
今天就到这里。希望你从这个案例研究中有所收获,或者如果你也遇到过类似的情况,也欢迎分享你采取的方法。敬请期待下一篇 JS hack!😃
文章来源:https://dev.to/ahmedgmurtaza/use-closures-for-memory-optimizations-in-javascript-a-case-study-43h9