作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近开始接触 OOP javascript,并且越来越多地听说闭包。经过一天的绞尽脑汁,我现在理解了它们*,但我仍然看不到使用对象的优势。他们似乎在做同样的事情,但我怀疑我遗漏了什么。
*我觉得
编辑
我刚刚花了 20 分钟尝试使用一个作为对象编写的计数器和一个作为闭包编写的计数器来编写示例。我得出的结论是我仍然不理解闭包。
第二次编辑
好吧,我已经成功地完成了一个非常简单的例子。这两者之间没有太多区别,但我发现对象版本更具可读性。我为什么要选择一个而不是另一个?
/*** Closure way ***/
function closureCounter() {
var count = 0;
return {
increase : function() {
count++;
alert(count);
},
decrease : function () {
count--;
alert(count);
}
};
}
var myCounter = closureCounter();
myCounter.increase();
myCounter.decrease();
/*** Object way ***/
function objCounter() {
var count = 0;
this.increase = function() {
count++;
alert(count);
}
this.decrease = function() {
count--;
alert(count);
}
}
var myCounter = new objCounter();
myCounter.increase();
myCounter.decrease();
最佳答案
当闭包可以用更干净、更简单的代码做同样的事情时,您不必通过创建一个全新的对象来冒额外的错误和混淆的风险。使用闭包,链接对象要容易得多。
恰当的例子:
function attachOnclick(eSource, eParent) {
var e = document.createElement("div");
eParent.appendChild(e);
eSource.onclick = function() { e.style.backgroundColor = "881010"; }
}
对比
var elemLinks = [];
function attachOnclick2(eSource, eParent) {
var e = document.createElement("div");
eParent.appendChild(e);
elemLinks.push({elemSrc: eSource, elemDest: e}); // Append to mappings list
eSource.onclick = changeColor;
}
function changeColor() {
for(var i = elemLinks.length; i--;) {
if(this == elemLinks[i].elemSrc) { // We've found our match
elemLinks[i].elemDest.style.backgroundColor = "881010";
return true;
}
}
return false;
}
如果您在第二个示例中发现任何错误,那么这恰恰证明了我的观点,即闭包使编写简单、清晰的代码变得更加容易。
关于javascript - 为什么我会选择闭包而不是对象有实际原因吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3982043/
我是一名优秀的程序员,十分优秀!