我是 trying我最难理解 JavaScript 闭包。
我通过返回一个内部函数来获得这一点,它可以访问在其直接父级中定义的任何变量。
这对我有什么用处?也许我还没有完全理解它。大部分examples I have seen online不提供任何真实世界的代码,只是模糊的例子。
有人可以告诉我闭包的真实使用吗?
例如是这个吗?
var warnUser = function (msg) {
var calledCount = 0;
return function() {
calledCount++;
alert(msg + '\nYou have been warned ' + calledCount + ' times.');
};
};
var warnForTamper = warnUser('You can not tamper with our HTML.');
warnForTamper();
warnForTamper();
最佳答案
假设,您想统计用户点击网页上某个按钮的次数。
为此,您将在按钮的 onclick
事件上触发一个函数来更新变量的计数
<button onclick="updateClickCount()">click me</button>
现在可能有很多方法,例如:
您可以使用全局变量,以及增加计数器的函数:
var counter = 0; function updateClickCount() { ++counter; // Do something with counter }
但是,陷阱在于页面上的任何脚本都可以更改计数器,而无需调用
updateClickCount()
。
现在,您可能正在考虑在函数内声明变量:
function updateClickCount() { var counter = 0; ++counter; // Do something with counter }
但是,嘿!每次调用
updateClickCount()
函数时,计数器都会再次设置为 1。
考虑嵌套函数?
嵌套函数可以访问它们“上方”的范围。
在本例中,内部函数
updateClickCount()
可以访问父函数countWrapper()
中的计数器变量:function countWrapper() { var counter = 0; function updateClickCount() { ++counter; // Do something with counter } updateClickCount(); return counter; }
如果你可以从外部访问
updateClickCount()
函数并且你还需要找到一种方法来执行counter = 0
不是每次都只有一次。
救援结束! (自调用函数):
var updateClickCount = (function(){ var counter = 0; return function(){ ++counter; // Do something with counter } })();
自调用函数只运行一次。它将
counter
设置为零 (0),并返回一个函数表达式。这样
updateClickCount
就变成了一个函数。 “奇妙”的部分是它可以访问父范围内的计数器。这称为 JavaScript 闭包。它使函数可以具有“private”变量。
counter
受匿名函数作用域保护,只能使用updateClickCount()
函数更改!
更生动的闭包示例
<script>
var updateClickCount = (function(){
var counter = 0;
return function(){
++counter;
document.getElementById("spnCount").innerHTML = counter;
}
})();
</script>
<html>
<button onclick="updateClickCount()">click me</button>
<div> you've clicked
<span id="spnCount"> 0 </span> times!
</div>
</html>
关于javascript - JavaScript 中闭包的实际用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2728278/