首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript闭包: MDN实用闭包

JavaScript闭包: MDN实用闭包
EN

Stack Overflow用户
提问于 2014-10-21 02:54:29
回答 2查看 913关注 0票数 1

关于向六岁儿童解释JavaScript闭包,有一个很好的堆叠溢出问题。

这个问题有许多非常有用的答案。其中一个答案提到了在指南中的闭包的条目,它确实提供了一个简洁易懂的解释(具体来说,闭包存储一个函数及其环境)。

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

作为一名初级程序员,我只能假设我不使用闭包的选择(如下所示)是天真和不正确的(尽管看起来更简洁和高效)?

当MDN条目读到时,我特别感兴趣的是文本大小闭包的合理性:

如果某个特定任务不需要闭包,则在其他函数中不必要地创建函数是不明智的,因为它将在处理速度和内存消耗方面对脚本性能产生负面影响。

未关闭的版本:

HTML (从MDN原版修改)

代码语言:javascript
复制
<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 (未修改)

代码语言:javascript
复制
body {
  font-family: Helvetica, Arial, sans-serif;
  font-size: 12px;
}

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

JavaScript (改性)

代码语言: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 (取代原来的MDN)

来自MDN的原件

代码语言:javascript
复制
function makeSizer(size) {
  return function() {
    document.body.style.fontSize = size + 'px';
  };
}

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

回答 2

Stack Overflow用户

发布于 2014-10-21 03:04:57

它主要用于防止物体污染全球空间。在闭包中,可以使变量成为局部变量和内部“实现”细节。闭包的主要好处实际上是能够创建私有范围。

这里提出的性能论证实际上与这个级别上的微观优化有关,而不是一个实际的关注点。

票数 0
EN

Stack Overflow用户

发布于 2014-10-21 03:10:39

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

全局命名空间:

代码语言:javascript
复制
var i = 0;
function inc() {
   i++;
   console.log(i);
}
inc(); // output 1 
console.log(i); //output 1

关闭:

代码语言:javascript
复制
function closure() {
   var i = 0;
   return function() {
      i++;
      console.log(i);
   }
}
myClosure = new closure();
myClosure(); //output 1;
myClosure(); //output 2;
console.log(i); //undefined
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26478177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档