携手创作,共同成长!这是我参与「掘金日新计划 · 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内部封装的目的,同时我们也可以学习该封装处理,后续在实现兼容不同环境的方法库时可以借鉴。