资讯专栏INFORMATION COLUMN

underscore.js 源码学习 读书笔记(一)

lx1036 / 2624人阅读

摘要:所以经常会在一个源码中看到写法吧立即执行函数创建变量,保存全局根变量。

</>复制代码

  1. // ================立即执行函数================
  2. // 使用(function(){}())立即执行函数,减少全局变量
  3. // ----????----函数声明 function (){} 与函数表达式 var funName = function(){}----????----
  4. // function(){}() 结果会返回Uncaught SyntaxError: Unexpected token (
  5. // 因为此处,编译器会将function当做函数声明关键字去编译,而(并不可以当做函数名
  6. // (function(){}()) 可以正常执行
  7. // 此处function 被挡住表达式编译
  8. // ----????----函数声明 function (){} 与函数表达式 var funName = function(){}----????----
  9. // ~function(){}()/+function(){}()/-function(){}()/!function(){}()
  10. // true && function(){}()
  11. // 0,function(){}
  12. // 以上三种情况下,function都会被当成表达式去编译。
  13. // 所以经常会在一个源码中看到~function写法吧//
  14. // ================立即执行函数================
  15. (function(){}(
  16. // 创建root变量,保存全局根变量。
  17. // 浏览器window
  18. // 服务器global,部分虚拟机this
  19. // WebWorker中为self
  20. // ================&& ||操作================
  21. // 逻辑与&& 的优先级高于 逻辑非||
  22. // 逻辑与&&为断路逻辑,
  23. // 任何一个值var Boolean(var)==false,立即返回var,否则返回最后一个值
  24. // 逻辑非||为短路逻辑,
  25. // 任何一个值var Boolean(var)===true,立即返回var,,否则返回最后一个值
  26. // ================&& ||操作================
  27. var root = typeof self == "object" && self.self === self && self || typeof global == "object" && global.global === global && global || this || {};
  28. // 保存已存在的全局中_变量,以便避免变量冲突
  29. var previousUnderscore = root._;
  30. // Naked function reference for surrogate-prototype-swapping.
  31. // https://stackoverflow.com/questions/30496650/what-is-surrogate-prototype-swapping-in-javascript
  32. // 关于surrogate-prototype-swapping是什么的理解:
  33. // Ctor就是一个裸函数,本身并没有什么特别的,特别之处在于用途
  34. // Ctor用于在baseCreate函数中暂存要继承的原型对象,并构造一个新的对象
  35. var Ctor = function() {};
  36. var nativeCreate = Object.create;
  37. // An internal function for creating a new object that inherits from another.
  38. // 内部函数,用于构造继承指定对象prototype的新对象
  39. var baseCreate = function(prototype) {
  40. if (!_.isObject(prototype)) return {};
  41. if (nativeCreate) return nativeCreate(prototype);
  42. //暂存
  43. Ctor.prototype = prototype;
  44. var result = new Ctor;
  45. //销毁
  46. Ctor.prototype = null;
  47. return result;
  48. };
  49. // Create a safe reference to the Underscore object for use below.
  50. // 创建安全作用域
  51. var _ = function(obj) {
  52. //obj在_原型链上
  53. if (obj instanceof _) return obj;
  54. //不是,构造一个
  55. if (!(this instanceof _)) return new _(obj);
  56. //将underscore对象存在_.wrapped属性上
  57. this._wrapped = obj;
  58. };
  59. // Utility Functions
  60. // -----------------
  61. // 避免冲突,将原本的_变量重新复制给_
  62. _.noConflict = function() {
  63. root._ = previousUnderscore;
  64. return this;
  65. };
  66. // Export the Underscore object for **Node.js**, with
  67. // backwards-compatibility for their old module API. If we"re in
  68. // the browser, add `_` as a global object.
  69. // 在nodejs中导出,兼容旧版本
  70. // nodeTyoe用于检测变量是否为HTML元素
  71. // (`nodeType` is checked to ensure that `module`
  72. // and `exports` are not HTML elements.)
  73. if (typeof exports != "undefined" && !exports.nodeType) {
  74. if (typeof module != "undefined" && !module.nodeType && module.exports) {
  75. exports = module.exports = _;
  76. }
  77. exports._ = _;
  78. } else {
  79. root._ = _;
  80. }
  81. // AMD registration happens at the end for compatibility with AMD loaders
  82. // that may not enforce next-turn semantics on modules. Even though general
  83. // practice for AMD registration is to be anonymous, underscore registers
  84. // as a named module because, like jQuery, it is a base library that is
  85. // popular enough to be bundled in a third party lib, but not be part of
  86. // an AMD load request. Those cases could generate an error when an
  87. // anonymous define() is called outside of a loader request.
  88. // AMD规范导出
  89. if (typeof define == "function" && define.amd) {
  90. define("underscore", [], function() {
  91. return _;
  92. });
  93. }
  94. ))

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/103690.html

相关文章

  • 《高性能JavaScript》(读书笔记

    摘要:加载的模块会以参数形式传入该函数,从而在回调函数内部就可以使用这些模块。异步加载,和,浏览器不会失去响应它指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题。插件,可以让回调函数在页面结构加载完成后再运行。 这次主要是对《高性能JavaScript》一书的读书笔记,记录下自己之前没有注意到或者需要引起重视的地方 第一章 加载和执行 js代码在执行过程中会阻塞浏览...

    moven_j 评论0 收藏0
  • Backbone.js学习笔记

    摘要:它通过数据模型进行键值绑定及事件处理,通过模型集合器提供一套丰富的用于枚举功能,通过视图来进行事件处理及与现有的通过接口进行交互。 本人兼职前端付费技术顾问,如需帮助请加本人微信hawx1993或QQ345823102,非诚勿扰 1.为初学前端而不知道怎么做项目的你指导 2.指导并扎实你的JavaScript基础 3.帮你准备面试并提供相关指导性意见 4.为你的前端之路提供极具建设性的...

    FrancisSoung 评论0 收藏0
  • 如何学JavaScript

    摘要:书籍如下面向对象编程指南,风格轻松易懂,比较适合初学者,原型那块儿讲得透彻,种继承方式呢。还有另一件事情是,比如发现自己某个知识点不太清楚,可以单独去百度。 作者:小不了链接:https://zhuanlan.zhihu.com/p/...来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 鉴于时不时,有同学私信问我(老姚,下同)怎么学前端的问题。这里统一回...

    light 评论0 收藏0
  • Underscore.js 1.8.3 学习笔记

    摘要:值得注意的是,如果值在前面也就是值小于值,那么值域会被认为是零长度,而不是负增长。 underscore.js源码加注释一共1500多行,它提供了一整套函数式编程实用的功能,一共一百多个函数,几乎每一个函数都可以作为参考典范。初读的时候,真是一脸懵圈,各种函数闭包、迭代和嵌套的使用,让我一时很难消化。在这里,我来记录一下我学习underscore.js的一些发现,以及几个我认为比较经典...

    springDevBird 评论0 收藏0
  • 前端资源系列(4)-前端学习资源分享&前端面试资源汇总

    摘要:特意对前端学习资源做一个汇总,方便自己学习查阅参考,和好友们共同进步。 特意对前端学习资源做一个汇总,方便自己学习查阅参考,和好友们共同进步。 本以为自己收藏的站点多,可以很快搞定,没想到一入汇总深似海。还有很多不足&遗漏的地方,欢迎补充。有错误的地方,还请斧正... 托管: welcome to git,欢迎交流,感谢star 有好友反应和斧正,会及时更新,平时业务工作时也会不定期更...

    princekin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<