美文网首页IT 全栈开发
关于闭包和模块的一些东西

关于闭包和模块的一些东西

作者: 醋留香 | 来源:发表于2020-11-24 17:56 被阅读0次

1. 先谈谈闭包

全局变量会污染环境, 这个都清楚
加入你定义的一个数组变量叫 arr, 你能确保别人的数组变量不再用这个名字了么?
如果不想污染全局环境, 只能将变量做成局部的

function addToArr(element) {
  var arr = [];
  arr.push(element);
  return element + " added to " + arr;
}

var firstPass = addToArr("a");
var secondPass = addToArr("b");
console.log(firstPass); // a added to a
console.log(secondPass); // b added to b

但是这样写的话, 就会有另外一个问题,
虽然 arr 变量不会污染全局环境了, 但是, 每次调用 addToArr 函数的时候, arr 都是一个新的空数组, 不能持续!!!

所以 我在这想达到的效果就是, 即让 arr 做成局部的, 又要让 arr 不丢之, 不被重置.

此时, 我们可以把 内部的 push 动作包装成一个函数并返回, 所以就有了下面的代码:

function addToArr() {
  var arr = [];

  return function push(element) {
    arr.push(element);
    console.log(arr);
  };
}
var result = addToArr();
result("a"); // [ 'a' ]
result("b"); // [ 'a', 'b' ]

在此, 可以把这种情景称为 "闭包": 一个能够记住其环境变量的函数!!!

内部函数必须是一个封闭(外部)函数的返回值。这种也称为工厂函数。

下一步, 我们再把内部函数匿名一下:

function addToArr() {
  var arr = [];

  return function(element) {
    arr.push(element);
    return element + " added to " + arr;
  };
}

var closure = addToArr();
console.log(closure("a")); // a added to a
console.log(closure("b")); // b added to a,b

ok, 这样做就解决我们的需求了
但是js中闭包的真正目的是什么呢?

  • 提供私有的全局变量
  • 在函数调用之间保存变量(状态)
    JS中闭包最有趣的应用程序之一是模块模式。在ES6之前,除了将变量和方法封装在函数中之外,没有其他方法可以模块化JS代码并提供私有变量与方法。
    闭包与立即调用的函数表达式相结合 是至今通用解决方案。堪称完美☺
var Person = (function(){
  // do something
})()

接下来说一下如何"私有化"变量和方法:

var Person = (function() {
  var person = {
    name: "",
    age: 0
  };

  function setName(personName) {
    person.name = personName;
  }

  function setAge(personAge) {
    person.age = personAge;
  }
})();

很棒, 外部再也不能访问 person 变量 和 setName 和 setAge 这些东西了, 真是真真正正的实现的"私有化"
如果你想公开谁, 就可以返回谁
如果想公开多个, 可以返回一个包含对私有方法引用的对象。

var Person = (function() {
  var person = {
    name: "",
    age: 0
  };

  function setName(personName) {
    person.name = personName;
  }

  function setAge(personAge) {
    person.age = personAge;
  }

  return {
    setName: setName,
    setAge: setAge
  };
})();

好了 你很棒, 到此为止, 模块的雏形已经被你掌握了, 剩下的, 可以在来聊点关键字问题了 😁

相关文章

  • 关于闭包和模块的一些东西

    1. 先谈谈闭包 全局变量会污染环境, 这个都清楚加入你定义的一个数组变量叫 arr, 你能确保别人的数组变量不再...

  • 14.Swift学习之闭包

    闭包引入 计算1个数的平方 函数写法 闭包写法 闭包含义 闭包是可以被传递和引用的一个独立模块 闭包能够捕获和存储...

  • swift中的闭包和oc中的block的定义和用法对比

    一.闭包的介绍 闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objecti...

  • 关于闭包

    最近在看JavaScript高程和一些博客的时候对闭包有了更深的认识,关于闭包更像是JavaScript词法作用域...

  • JavaScript - 闭包

    理解 关于闭包 答案: 用arguments.callee和闭包实现的函数封装 应用 利用闭包实现自动递增计数

  • Swift4闭包

    闭包是可以在你的代码中被传递和引用的功能性独立模块。Swift 中的闭包和 C 以及 Objective-C 中...

  • 九、闭包 闭包表达式

    闭包 什么是闭包 1.官方定义 闭包是可以在代码中被传递和引用的功能型独立模块。类似于OC中的block以及其他语...

  • js 代码模块化

    JavaScript代码模块化 隐藏模块内部实现 定义模块接口 解决依赖关系 利用对象、闭包和立即执行函数实现模块...

  • swift学习-闭包

    闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和Objective-C 中的 b...

  • Swift3.0闭包(Closures)

    闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C中的 b...

网友评论

    本文标题:关于闭包和模块的一些东西

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