美文网首页
也说闭包

也说闭包

作者: 进击的前端 | 来源:发表于2016-08-05 14:42 被阅读24次

好像闭包也是JS绕不过的一个问题。

闭包的定义

第一个是闭包的形式。简而言之就是一个函数返回被外部调用的函数,makeFunc是一个闭包,它返回了displayName的定义,而这个displayName能够记录makeFunc运行的时候的局部变量。

function makeFunc() {
  var name = "Mozilla";
  function displayName() {
    alert(name);
  }
  return displayName;
}

var myFunc = makeFunc();
myFunc();

闭包的用途

产生不同的回调函数

function makeSizer(size) {
  return function() {
    document.body.style.fontSize = size + 'px';
  };
}
var size12 = makeSizer(12);
var size14 = makeSizer(14);
var size16 = makeSizer(16);
document.getElementById('size-12').onclick = size12;
document.getElementById('size-14').onclick = size14;
document.getElementById('size-16').onclick = size16;

闭包模拟私有方法

私有方法不仅仅有利于限制对代码的访问:还提供了管理全局命名空间的强大能力,避免非核心的方法弄乱了代码的公共接口部分。

var Counter = (function() {
  var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }
  return {
    increment: function() {
      changeBy(1);
    },
    decrement: function() {
      changeBy(-1);
    },
    value: function() {
      return privateCounter;
    }
  }   
})();

console.log(Counter.value()); /* logs 0 */
Counter.increment();
Counter.increment();
console.log(Counter.value()); /* logs 2 */
Counter.decrement();
console.log(Counter.value()); /* logs 1 */

首先Count = (function(){})(),立即执行函数,得到return的一个对象,对象保存了不同的函数,而函数能够访问闭包中的元素。同时,闭包中的私有变量并不能被外界访问。

闭包的循环陷阱

function showHelp(help) {
  document.getElementById('help').innerHTML = help;
}
function setupHelp() {
  var helpText = [
      {'id': 'email', 'help': 'Your e-mail address'},
      {'id': 'name', 'help': 'Your full name'},
      {'id': 'age', 'help': 'Your age (you must be over 16)'}
    ];
  for (var i = 0; i < helpText.length; i++) {
    var item = helpText[i];
    document.getElementById(item.id).onfocus = function() {
      showHelp(item.help);
    }
  }
}
setupHelp();

这个是典型的循环问题,因为共享一个变量,所以每次真正调用的是。

闭包的缺点

除了循环陷阱,性能和内存也是有问题的。

参考

MDN

相关文章

  • 也说闭包

    好像闭包也是JS绕不过的一个问题。 闭包的定义 第一个是闭包的形式。简而言之就是一个函数返回被外部调用的函数,ma...

  • 14-Swift中的闭包

    闭包的介绍 闭包和OC中的Block非常相似(通俗点说:你也可以这么理解,Swift的闭包就是OC中的Block)...

  • Groovy 闭包

    闭包 闭包是一段可执行的代码块,类似于方法也可以传递参数;可在闭包中访问属性值,也就是说可以修改闭包作用域中的所有...

  • 什么是闭包

    从入行就有人跟我说闭包,到现在闭包也是前端躲不开的概念,每次面试的时候我也会问一下闭包相关的问题,今天针对闭包写一...

  • JavaScript中的闭包

    什么是闭包,闭包的定义是什么 函数和其本身对周围状态的引用两者捆绑在一起构成闭包。也即是说闭包可以从函数内部访问外...

  • js闭包浅析

    什么是闭包 「函数」和「函数内部能访问到的变量」(也叫环境)的总和,就是一个闭包。 有些人说闭包就是函数套函数,然...

  • swift-闭包

    闭包 闭包定义 闭包简化 - 尾随闭包 闭包参数 闭包返回值 闭包的循环引用

  • Swift: 关键词

    一、@escaping(逃逸闭包) 默认情况下,闭包是非逃逸闭包 非逃逸闭包的作用域是不会超过函数本身的,所以说我...

  • 闭包

    闭包是什么;闭包的作用;闭包的一些特点。 什么是闭包,简单的说就是函数嵌套函数(红宝书),在函数作用域内,可以访问...

  • 闭包,闭包,闭包

    1、这家伙到底是什么? 网上关于这个的讨论的太多了太多了,有各种的举例子,但是大部分还在寻找这个答案的小伙伴对于变...

网友评论

      本文标题:也说闭包

      本文链接:https://www.haomeiwen.com/subject/iubhsttx.html