JavaScript闭包:MDN实用闭包

时间:2014-10-21 02:54:29

标签: javascript closures

关于explaining JavaScript closures to six-year olds,有一个很棒的stackoverflow问题。

这个问题有很多非常有用的答案。其中一个答案是指Closures at the Mozilla Developer Network JavaScript guide的条目,它确实提供了一个简洁易懂的解释(具体来说,一个闭包存储函数及其环境 )。

然而,实际闭包下的MDN条目让我感到困惑......具体而言,在他们的示例中需要关闭文本的大小?有人可以为我澄清为什么他们需要关闭makeSizer函数吗?

作为初学程序员,我只能假设我的替代方案不使用闭包,如下所示,是某种天真和不正确(尽管看起来更简洁和有效)?

我对MDN条目读取时文本大小关闭的理由特别感兴趣:

  

在其他功能中不必要地创建功能是不明智的   如果特定任务不需要闭包,就像它一样   在处理速度方面对脚本性能产生负面影响   和记忆消耗。

没有关闭的版本:

HTML(从MDN原始版本修改)

<p>Some paragraph text</p>
<h1>some heading 1 text</h1>
<h2>some heading 2 text</h2>

<a href="#" class="sizer">12</a>
<a href="#" class="sizer">14</a>
<a href="#" class="sizer">16</a>

CSS(未修改)

body {
  font-family: Helvetica, Arial, sans-serif;
  font-size: 12px;
}

h1 {
  font-size: 1.5em;
}
h2 {
  font-size: 1.2em;
}

JavaScript(已修改)

(function makeSizer() {
   var sizers = document.getElementsByClassName('sizer');
    for (var i = 0; i < sizers.length; i++) {
        sizers[i].onclick = function () {document.body.style.fontSize = this.innerHTML + "px";};
    }; // close for...
})(); // close makeSizer;

JSFiddle (alternative to the original from MDN)

Original from MDN

function makeSizer(size) {
  return function() {
    document.body.style.fontSize = size + 'px';
  };
}

var size12 = makeSizer(12);
var size14 = makeSizer(14);
var size16 = makeSizer(16);

2 个答案:

答案 0 :(得分:0)

它主要用于防止对象污染全局空间。在闭包中,您可以将变量设置为局部变量和内部“实现”细节。闭包的主要好处实际上是创建私有范围的能力。

此处的性能论证确实与此级别的微优化相关,并不是一个实际问题。

答案 1 :(得分:0)

如果需要在特定名称空间中存储值并稍后重用它们,而不是使用全局名称空间示例,则可以使用闭包。

全局命名空间:

var i = 0;
function inc() {
   i++;
   console.log(i);
}
inc(); // output 1 
console.log(i); //output 1

关闭:

function closure() {
   var i = 0;
   return function() {
      i++;
      console.log(i);
   }
}
myClosure = new closure();
myClosure(); //output 1;
myClosure(); //output 2;
console.log(i); //undefined