您需要考虑作用域。当您调用
showClick()
时,会创建一个作用域。在这个作用域内,它创建了一个名为“clicks”的变量。此变量仅在此函数及其所有子函数/闭包中有效。
该函数返回一个新函数,即所谓的闭包。这个闭包保持对封装函数作用域的访问。每次调用
showClick()
时,都会生成一个新的作用域,在此作用域内有
clicks
变量。此外还会创建并返回闭包。作用域、其中的变量和闭包并不相同,每次调用showClicks时都不同。
这就是它们为什么单独计数的原因。
如果要将两个点击计数在一起......有多种解决方案。
- 首先,您可以删除闭包。您不需要它。
- 将闭包保存为showClick函数的上下文,并在每次调用showClick时使用它
- 将点击保存在全局范围内(不建议)
编辑:如在评论中提问的那样,这里介绍两种保存闭包并重复使用它的方法:
1)"Singleton-Approach I"(保存闭包本身)
function showClick() {
if(showClick.closure) return showClick.closure;
var clicks = 0;
return showClick.closure = function(evt) {
clicks++;
console.log(clicks+' at '+evt.clientX+' / '+evt.clientY);
}
}
document.getElementsByTagName('a')[0].onclick = showClick();
document.getElementsByTagName('a')[1].onclick = showClick();
2) 单例模式 II (保存点击计数)
function showClick() {
showClick.clicks = showClick.clicks || 0;
return function(evt) {
showClick.clicks++;
console.log(showClick.clicks+' at '+evt.clientX+' / '+evt.clientY);
}
}
document.getElementsByTagName('a')[0].onclick = showClick();
document.getElementsByTagName('a')[1].onclick = showClick();
3) "上下文方法"(将闭包保存为工厂函数的上下文)
var showClick = (function showClick() {
return this;
}).bind((function() {
var clicks = 0;
return function(evt) {
clicks++;
console.log(clicks+' at '+evt.clientX+' / '+evt.clientY);
};
})());
document.getElementsByTagName('a')[0].onclick = showClick();
document.getElementsByTagName('a')[1].onclick = showClick();