[ JS个人笔记 ] 闭包Closure—DAY6

  • 简单来说,就是呼叫函式内的函式,将记忆体封存在内层。

  • 像这样,我们把 count 封装在 counter() 当中,不但可以让里面的 count 不会暴露在 global 环境造成变数冲突,也可以确保内部 count 被修改。

function counter(){
  var count = 0;

  function innerCounter(){
    return ++count;
  }

  return innerCounter;
}

var countFunc = counter();

console.log( countFunc() );   // 1
console.log( countFunc() );   // 2
console.log( countFunc() );   // 3
  • 外值得一提的是,过去我们需要新增另一个计数器时,可能会再新增另一个全域变数去储存另一个 count 的状态。 而改用闭包的写法之後,只需要像这样:
  • 此时你就会发现 countFunc 与 countFunc2 分别是「独立」的计数器实体,彼此不会互相干扰!
function counter(){
  var count = 0;

  return function(){
    return ++count;
  }
}

var countFunc = counter();
var countFunc2 = counter();

console.log( countFunc() );   // 1
console.log( countFunc() );   // 2
console.log( countFunc() );   // 3

console.log( countFunc2() );   // 1
console.log( countFunc2() );   // 2
  • Closure常见应用

function callMethod(newMoney) {
  var money = newMoney || 1000;
  return function (price) {
    money = money - price;
    return money;
  }
}
let updateMyMoney = callMethod(10000000000);
let updateYourMoney = callMethod(1000);
console.log(updateMyMoney(100));
console.log(updateYourMoney(100));
  • 实现 private
    =>使用闭包来定义公共函数,且其可以访问私有函数和变数,这个方式也称为模组模式(module pattern)。
/*自调用函数,共用生存域*/
function Counter() {
  let innerCounter = 0;
  function change(val) {
    innerCounter += val;
  }
  return {
    addone: function() {
      change(1);
    },
    deone: function() {
      change(-1);
    },
    value: function() {
      return innerCounter;
    }
  }
}

let newCounter = Counter()
console.log(newCounter.value()); /* logs 0 */

newCounter.addone();
newCounter.addone();

console.log(newCounter.value()); /* logs 2 */

newCounter.deone();

console.log(newCounter.value()); /* logs 1 */

<<:  风险评估(Risk Evaluation)

>>:  Day28 参加职训(机器学习与资料分析工程师培训班),网站设计与网页工程技术

产生 资料库 DbContext 实体原型

Scaffold-DbCoNtext 为资料库的 DbContext 和实体类型产生程序码。 为了让...

[ Day 7 ] - 判断与流程控制

判断与流程控制 if 判断式 以白话文来说,就是『当符合某一个条件,就做某一件事』 语法范例: if...

【Day21】给我一个节点,我可以把网页改头换面

「DOM API 定义了 JavaScript 存取、改变 HTML 架构、内容、样式的方法,甚至...

Day09 - Gem-jwt 介绍与应用

前言 JWT 是 JSON Web Token 的缩写。在写此篇时,发现已经有许多相关文章可参考,故...

Day29_ISO27037数位证据处理程序国际标准-2021/10/12

Day21_控制项(A16资讯安全事故管理)有稍微提到的数位监识~继续作功课呀~ ▉ISO 2703...