lodash里的is系列(四)

205 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情

前言

继lodash的is系列之后的篇章,本篇章主要讲解is系列判断方法实现中提炼出来的内部通用方法和变量,包括baseUnary方法,freeGlobal变量以及nodeUtil变量,提炼封装的目的在于为了环境的兼容性,为了处理node环境和浏览器环境下的方法调用。

freeGlobal

freeGlobal变量主要是为了获取node环境下全局的global变量,在node环境下则取得node下的global变量,在浏览器环境下则赋值为false。

在实现上,通过判断全局global变量是否存在,同时global变量应该满足类型为对象类型且身上具有Object属性,当且仅当前者成立并且global.Object === Object时,给freeGlobal变量赋值node环境下的global变量或浏览器环境下为false。

var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;

nodeUtil

nodeUtil方法主要用于获取node环境下的工具方法,其中实现上借助了freeGlobal变量获取node环境下的process变量。

内部处理中各个变量语义如下:

  • freeExports变量主要获取node环境下的exports变量。

  • freeModule变量主要获取node环境下的module变量。

  • moduleExports变量主要获取node环境下的module.exports变量。

  • freeProcess 变量主要获取node环境下的process变量。

其中,第一个return主要获取对Node.js 10+下的util.types;第二个return主要获取Node.js < 10 的旧版process.binding('util')

源码如下:

import freeGlobal from './_freeGlobal.js';

var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;

var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;

var moduleExports = freeModule && freeModule.exports === freeExports;

var freeProcess = moduleExports && freeGlobal.process;

var nodeUtil = (function() {
  try {
    var types = freeModule && freeModule.require && freeModule.require('util').types;

    if (types) {
      return types;
    }

    return freeProcess && freeProcess.binding && freeProcess.binding('util');
  } catch (e) {}
}());

baseUnary

baseUnary方法主要是返回新的函数,通过嵌套关系方便某些场景下的调用传参。

源码如下:

function baseUnary(func) {
  return function(value) {
    return func(value);
  };
}

小结

本篇章我们讲解baseUnary方法,freeGlobal变量以及nodeUtil变量的实现,学习这三个封装的方法和变量主要是为了后续处理is系列的类型判断和环境兼容性问题,这也是lodash内部封装的目的,同时我们也可以学习该封装处理,后续在实现兼容不同环境的方法库时可以借鉴。