JS高阶编程技巧:利用闭包的机制,实现出来的一些高阶编程方式

  • 模块化思想
  • 惰性函数
  • 柯理化函数
    • 高阶组件 -> React
    • 函数防抖和节流
    • bind
  • compose组合函数
模块化思想

单例->AMD(require.js)->CMD(sea.js)->CommonJS规范(Node)->ES6Module
比如:想实现一个页面的功能,这个页面分天气板块,资讯板块

没有模块化思想之前
  1. 没有模块化思想之前,团队协作开发或者代码量较多的情况,回导致全局变量污染「全局变量冲突」
// 实现天气版块
var time = '2020-11-01';
function queryData() {
    // ...
}
function changeCity() {
    //...
}
// 实现资讯版块
var time = '2020-10-31';
function changeCity() {
    //...
} 
  1. 如何避免变量冲突–暂时基于闭包的“保护作用”防止了全局变量的污染 「但是因为每个版块的代码都是私有的,无法相互调用」
(function () {
    var time = '2020-11-01';
    function queryData() {}
    function changeCity() {}
})();

(function () {
    var time = '2020-10-31';
    function changeCity() {}
})();
  1. 基于某些方法去实现相互调用
(function () {
    var time = '2020-11-01';
    function queryData() {}
    function changeCity() {}
    // 把需要供别人调用的API方法,挂载到全局上「不能挂载太多,挂载多了,还是会引发全局变量的污染」
    window.queryData=queryData;
})();

(function () {
    var time = '2020-10-31';
    function changeCity() {}
    queryData();
})(); 
模块化思想
  1. 目前比较优势的做法:利用对象
  • 对象的特点:每一个对象都是一个单独的堆内存空间(单独的实例->Object),这样即使多个对象中的成员名字相同,也互不影响
  • 仿照其他后台语言,其实obj1/obj2不仅仅称为对象名,更被称为“命名空间「给堆内存空间起一个名字」”
  • 每一个对象都是一个单独的实例,用来管理自己的私有信息,即使名字相同,也互不影响,其实这就是“JS中的单例设计模式”
var obj1 = {
    name: 'hello',
    age: 12,
    fn: function () {}
};
var obj2 = {
    name: 'world',
    age: 30,
   

2. 高级单例设计模式:闭包+单例的结合,也是最早期的JS模块化思想

var weatherModule=(function () {
    var time = '2020-11-01';
    function queryData() {}
    function changeCity() {}
    return {
        queryData:queryData,
        changeCity:changeCity
    };
})();

var infoModule=(function () {
    var time = '2020-10-31';
    function changeCity() {}
    weatherModule.queryData();
    return {
        changeCity:changeCity
    };
})();

var skinModule=(function(){
    // ...
    return {};
})(); 
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐