如何在 JavaScript 闭包函数中保留变量?
在本教程中,我们将学习在 JavaScript 闭包函数中保留变量的方法。
什么是闭包函数?闭包函数允许从内部函数访问外部函数的作用域。它也允许使用私有变量。闭包变量存储在栈和堆中。
创建函数时,也会创建闭包。闭包会记住在其中使用的外部内容。闭包是数据隐私的主要机制。
一个缺点是使用的变量不会被垃圾回收。过度使用闭包函数会由于内存中冗余代码而损害系统。
让我们简要介绍一下在闭包函数中保留变量的方法。
使用闭包返回函数
每次调用函数时,我们必须在重新初始化时保留 JavaScript 闭包变量。解决方案不是在每次调用函数时将对象设置为为空。
语法
用户可以按照以下语法使用闭包函数。
var closureFunction = function(param) { var object = {}; return function(param) { object[param] = param; return object; } }(); closureFunction(value1); closureFunction(value2);
此处,语法描述了一个返回对象的闭包函数。
参数
param − 闭包函数的参数。
示例
让我们在这个示例中了解闭包返回函数的必要性。
在这个程序中,我们首先调用 retClosProb(10)。在这个函数中,对象 retClosProbs 被设置为为空。然后将值赋给对象,并返回对象以进行显示。
请注意,在这个程序中,所有操作都在返回函数之外完成。由于对象在每次调用函数时都会重新初始化,因此我们每次都会单独获取对象值。也就是说,对象没有被保留。
<html> <html> <title>The JavaScript program to see a variable that is not preserved</title> </html> <body> <div id="retClosBtnWrap"> <p>Click this button to see the object that is not preserved</p> <button onclick="retClosAction()"> Click Me</button> </div> <p id="retClosOp1"></p> <p id="retClosOp2"></p> <script> var retClosOutEl1 = document.getElementById("retClosOp1"); var retClosOutEl2 = document.getElementById("retClosOp2"); var retClosBtnWrapEl = document.getElementById("retClosBtnWrap"); function retClosAction() { retClosBtnWrapEl.style.display = "none"; var retClosProb = function(id) { retClosProbs = {}; retClosProbs[id] = "Value " + id; return retClosProbs; return function() {} }; retClosOutEl1.innerHTML = JSON.stringify(retClosProb(10)); retClosOutEl2.innerHTML = JSON.stringify(retClosProb(20)); } </script> </body> </html>
示例
在这个示例中,让我们了解上面示例中所述问题的解决方案。
我们首先调用 retClosSoln(10)。在这个函数中,对象 retClosSoln 在函数内部声明。
与上面给出的问题示例相比,接下来是不同之处。将值赋给对象,并在返回函数内部返回对象以进行显示。
由于对象不会在每次调用函数时都重新初始化,因此我们将对象值一起获取。也就是说,对象被保留了。
<html> <body> <div id="retClosBtnWrap"> <p>Click this button to see the object that is preserved</p> <button onclick="retClosAction()"> Click Me</button> </div> <p id="retClosOp1"></p> <p id="retClosOp2"></p> <script> var retClosOutEl1 = document.getElementById("retClosOp1"); var retClosOutEl2 = document.getElementById("retClosOp2"); var retClosBtnWrapEl = document.getElementById("retClosBtnWrap"); function retClosAction() { retClosBtnWrapEl.style.display = "none"; var retClosSolns = function(id) { var retClosSoln = {}; return function(id) { retClosSoln[id] = "Value " + id; return retClosSoln; } }(); retClosOutEl1.innerHTML = JSON.stringify(retClosSolns(10)); retClosOutEl2.innerHTML = JSON.stringify(retClosSolns(20)); } </script> </body> </html>
示例
在这个示例中,我们使用了相同的闭包返回函数解决方案来保留变量,正如我们在上面示例中讨论的那样。这个程序的唯一区别在于我们从用户那里获取闭包变量的值。
<html> <body> <input type="text" id="retClosUsrInp1" placeholder="Enter name" /> <br><br> <input type="text" id="retClosUsrInp2" placeholder="Enter name" /> <div id="retClosUsrBtnWrap"> <p id="retClosUsrErr" style="color:red;font-weight:bold"></p> <p>Click this button to see the preserved values</p> <button onclick="retClosUsrAction()"> Click Me</button> </div> <p id="retClosUsrOp1"></p> <p id="retClosUsrOp2"></p> <script> var retClosUsrOutEl1 = document.getElementById("retClosUsrOp1"); var retClosUsrOutEl2 = document.getElementById("retClosUsrOp2"); var retClosUsrErrEl = document.getElementById("retClosUsrErr"); var retClosUsrBtnWrapEl = document.getElementById("retClosUsrBtnWrap"); function retClosUsrAction() { var retClosUsrVal1 = document.getElementById("retClosUsrInp1").value; var retClosUsrVal2 = document.getElementById("retClosUsrInp2").value; if (retClosUsrVal1 == "" || retClosUsrVal2 == "") { retClosUsrErr.innerHTML = "Please provide inputs and click on the button"; } else { retClosUsrBtnWrapEl.style.display = "none"; var retClosUsrSolns = function(id) { var retClosUsrSoln = {}; return function(id) { retClosUsrSoln[id] = "Hello " + id; return retClosUsrSoln; } }(); retClosUsrOutEl1.innerHTML = JSON.stringify(retClosUsrSolns(retClosUsrVal1)); retClosUsrOutEl2.innerHTML = JSON.stringify(retClosUsrSolns(retClosUsrVal2)); } } </script> </body> </html>
在本教程中,我们讨论了如何在 JavaScript 闭包函数中保留变量。
我们分析了问题案例,并通过在闭包中使用返回函数找到了解决方案。简而言之,闭包提供了数据封装。借助闭包,我们可以消除冗余代码。