JavaScript中关闭的实际用法是什么?
我正在努力将自己的头围绕在JavaScript关闭之上。
我通过返回一个内部函数来获取它,它将有权访问其直接父级中定义的任何变量。
这对我有用吗? 也许我还没有完全理解它。 我在网上看到的大多数例子都没有提供任何真实世界的代码,只是模糊的例子。
有人能告诉我一个真正的世界使用封闭?
例如,这是一个吗?
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();
我已经使用闭包来执行如下操作:
a = (function () {
var privatefunction = function () {
alert('hello');
}
return {
publicfunction : function () {
privatefunction();
}
}
})();
正如你在那里可以看到的, a
现在是一个对象,具有调用privatefunction
的方法publicfunction
( a.publicfunction()
),该privatefunction
只存在于闭包中。 你不能叫privatefunction
直接(即a.privatefunction()
只是publicfunction()
它是一个简单的例子,但也许你可以看到它的用途? 我们用这个来强制执行公共/私人方法。
假设你想要统计用户点击网页上的按钮的次数 。
为此,您正在触发onclick
事件按钮上的函数来更新变量的计数
<button onclick="updateClickCount()">click me</button>
现在可以有许多方法,例如:
1)你可以使用一个全局变量和一个函数来增加计数器 :
var counter = 0;
function updateClickCount() {
++counter;
// do something with counter
}
但是, updateClickCount()
是页面上的任何脚本都可以更改计数器,而无需调用updateClickCount()
。
2)现在,您可能正在考虑在函数内部声明变量:
function updateClickCount() {
var counter = 0;
++counter;
// do something with counter
}
但是,嘿! 每次updateClickCount()
函数时, 计数器都会再次被设置为1。
3)关于嵌套函数的思考?
嵌套函数可以访问“之上”的范围。
在这个例子中,内部函数updateClickCount()
可以访问父函数countWrapper()
的计数器变量
function countWrapper() {
var counter = 0;
function updateClickCount() {
++counter;
// do something with counter
}
updateClickCount();
return counter;
}
如果你可以从外部访问updateClickCount()
函数,并且你还需要找到一种方法来每次只执行一次counter = 0
,这可能解决了counter counter的困境。
4) 关闭营救! (自我调用功能) :
var updateClickCount=(function(){
var counter=0;
return function(){
++counter;
// do something with counter
}
})();
自调用函数只运行一次。 它将counter
设置为零(0),并返回一个函数表达式。
这样updateClickCount
就成为一个函数。 “精彩”部分是它可以访问父范围中的计数器。
这被称为JavaScript关闭 。 它使得函数具有“私有”变量成为可能。
该counter
受匿名函数范围的保护,只能使用add函数进行更改!
关闭的更生动的例子:
<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>
你给的例子是一个很好的例子。 闭包是一种抽象机制,可让您非常干净地分离问题。 你的例子是从语义(错误报告API)中分离检测(计数调用)的情况。 其他用途包括:
将参数化行为传递给算法(经典的高阶编程):
function proximity_sort(arr, midpoint) {
arr.sort(function(a, b) { a -= midpoint; b -= midpoint; return a*a - b*b; });
}
模拟面向对象编程:
function counter() {
var a = 0;
return {
inc: function() { ++a; },
dec: function() { --a; },
get: function() { return a; },
reset: function() { a = 0; }
}
}
实现异国流量控制,如jQuery的事件处理和AJAX API。
上一篇: What is a practical use for a closure in JavaScript?
下一篇: Can someone explain it to me what closure is in real simple language ?