Underscore.js源码分析(一)
来源:互联网 发布:小程序 数据显示 编辑:程序博客网 时间:2024/06/08 17:34
Underscore.js源码分析(一)
Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象。弥补了 jQuery 没有实现的功能,同时Underscore又足够简单,以1.8.3为例,整个库加注释也只有1627行,非常适合新手阅读。
我们现在读的源码版本是1.8.3,可以参考文档来更好的理解源码。
中文文档 英文文档
整个库的开始先用一个自执行函数封装一个作用域,然后在全局对象上挂载”_”来访问整个库提供的方法。
14-16 行可以看到如下代码
var root = typeof self == 'object' && self.self ===self && self || typeof global == 'object' && global.global === global && global || this;
在库的开始便使用self这个变量,但是self并没有在之前定义,这个self到底是什么呢?
其实无非两种可能,要么是全局对象,要么是全局变量,但是不用声明直接定义全局变量显的很不严谨,于是查了一下资料,发现self返回的是当前窗口的只读引用,相当于window的属性,并且在一些不具有窗口的上下文环境中,比如Web Workers中也可以使用,所以self更加通用,而self.self
相当于window.self
,同理global
是在Node.js的全局对象,所以这段代码的意思非常明确,就是判断当前库所处的环境,并且把全局对象设置为root。
在19行可以看到如下代码
var previousUnderscore = root._;
这段代码是在underscore的” _ “在挂载到全局对象之前先保存”_”里面的内容,避免被覆盖,非常细致。
在22-35行可以看到如下代码
var ArrayProto = Array.prototype, ObjProto = Object.prototype; var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; var push = ArrayProto.push, slice = ArrayProto.slice, toString = ObjProto.toString, hasOwnProperty = ObjProto.hasOwnProperty; var nativeIsArray = Array.isArray, nativeKeys = Object.keys, nativeCreate = Object.create;
这段代码也很好理解,将一些常用的方法赋值给变量,同时将一些ES5原生支持的方法赋值,在以后的使用中如果浏览器支持则使用原生方法,这样性能更好。
41-45 可以看到如下代码
var _ = function(obj) { if (obj instanceof _) return obj; if (!(this instanceof _)) return new _(obj); this._wrapped = obj; };
这段代码创建underscore的”_”对象,有点像单例模式,重复调用只创建一次。
52-59 可以看到如下代码
if (typeof exports != 'undefined' && !exports.nodeType) { if (typeof module != 'undefined' && !module.nodeType && module.exports) { exports = module.exports = _; } exports._ = _; } else { root._ = _; }
这段代码用来判断不同环境支持的模块加载机制,如果是node的环境则用modele.exports
导出,否则则直接挂载在全局对象,if (typeof exports != 'undefined' && !exports.nodeType)
这段判断很有意思,undefined
有两种可能,browser和node两种,然后在更具broswer中的nodeType排除在broswer中的情况。
这段代码和 14-16 行都有判断环境的作用,只是侧重点不同,是否可以整合到一起?(欢迎讨论)
- Underscore.js源码分析(一)
- underscore.js源码分析
- 读白刃underscore疑惑分析--underscore源码学习一
- Underscore.js 1.3.3 源码分析收藏
- underScore 源码解析(一)----简单介绍
- underScore 源码解析(一)---- 结构
- JS中判断相等的方法(underscore中eq方法源码分析)
- 读白刃underscore疑惑分析--underscore源码学习二
- 读白刃underscore疑惑分析--underscore源码学习三
- underscore.js源码解析之命名空间
- underscore.js源码解析之类型判断
- underscore源码学习(2)
- V-1.8.2 underscore源码解析(一)
- Underscore.js
- underscore.js
- Underscore.js
- underscore.js
- underscore.js
- 多线段几何图形—— 简单几何图形(多边形三角形化)
- C#入门6.13——字符串的替换
- 【UNIX网络编程】五种I/O模型,阻塞非阻塞同步异步问题详解
- SCPPO(十八):Redis在项目中的使用及性能测试(续)
- Java I/O系统之Writer
- Underscore.js源码分析(一)
- chown命令使用
- 插入排序和希尔排序
- 9.线程安全和共享资源
- java.lang.OutOfMemoryError
- 【一步一步学习VBA】Excel VBA 读取txt文件并写入Excel单元格(友好版)
- POJ 3368 线段树
- JavaScript 原型链
- 线性表综合实例之学生信息管理系统