underscore.js 源码进修 读书笔记(一)

// ================马上实行函数================
// 运用(function(){}())马上实行函数,削减全局变量
// ----????----函数声明 function (){} 与函数表达式 var funName = function(){}----????----
// function(){}() 效果会返回Uncaught SyntaxError: Unexpected token (
// 由于此处,编译器会将function当作函数声明关键字去编译,而(并不能够当作函数名
// (function(){}()) 能够一般实行
// 此处function 被盖住表达式编译
// ----????----函数声明 function (){} 与函数表达式 var funName = function(){}----????----
// ~function(){}()/+function(){}()/-function(){}()/!function(){}() 
// true && function(){}()
// 0,function(){}
// 以上三种情况下,function都会被当做表达式去编译。
// 所以常常会在一个源码中看到~function写法吧// 
// ================马上实行函数================

(function(){}(
    // 建立root变量,保留全局根变量。
    // 浏览器window
    // 服务器global,部份虚拟机this
    // WebWorker中为self    
// ================&& ||操纵================
// 逻辑与&& 的优先级高于 逻辑非||
// 逻辑与&&为断路逻辑,
// 任何一个值var Boolean(var)==false,马上返回var,不然返回末了一个值
// 逻辑非||为短路逻辑,
// 任何一个值var Boolean(var)===true,马上返回var,,不然返回末了一个值
// ================&& ||操纵================
    var root = typeof self == 'object' && self.self === self && self || typeof global == 'object' && global.global === global && global || this || {};
    
    // 保留已存在的全局中_变量,以便防止变量争执
    var previousUnderscore = root._;
    
    // Naked function reference for surrogate-prototype-swapping.
    // https://stackoverflow.com/questions/30496650/what-is-surrogate-prototype-swapping-in-javascript
    // 关于surrogate-prototype-swapping是什么的明白:
    // Ctor就是一个裸函数,自身并没有什么迥殊的,迥殊之处在于用处
    // Ctor用于在baseCreate函数中暂存要继续的原型对象,并组织一个新的对象
    var Ctor = function() {}; 
     var nativeCreate = Object.create;
    // An internal function for creating a new object that inherits from another.
      // 内部函数,用于组织继续指定对象prototype的新对象
    var baseCreate = function(prototype) {
        if (!_.isObject(prototype)) return {};
        if (nativeCreate) return nativeCreate(prototype);
          //暂存
        Ctor.prototype = prototype;
        var result = new Ctor;
          //烧毁
        Ctor.prototype = null;
        return result;
    };
    
    // Create a safe reference to the Underscore object for use below.
    // 建立平安作用域
    var _ = function(obj) {
        //obj在_原型链上
        if (obj instanceof _) return obj;
        //不是,组织一个
        if (!(this instanceof _)) return new _(obj);
        //将underscore对象存在_.wrapped属性上
        this._wrapped = obj;
    };
    
    // Utility Functions
    // -----------------
    // 防止争执,将底本的_变量从新复制给_
    _.noConflict = function() {
        root._ = previousUnderscore;
        return this;
    };
    
    // Export the Underscore object for **Node.js**, with
    // backwards-compatibility for their old module API. If we're in
    // the browser, add `_` as a global object.
     // 在nodejs中导出,兼容旧版本
     // nodeTyoe用于检测变量是不是为HTML元素
    // (`nodeType` is checked to ensure that `module`
    // and `exports` are not HTML elements.)
    if (typeof exports != 'undefined' && !exports.nodeType) {
        if (typeof module != 'undefined' && !module.nodeType && module.exports) {
            exports = module.exports = _;
        }
        exports._ = _;
    } else {
        root._ = _;
    }

    // AMD registration happens at the end for compatibility with AMD loaders
    // that may not enforce next-turn semantics on modules. Even though general
    // practice for AMD registration is to be anonymous, underscore registers
    // as a named module because, like jQuery, it is a base library that is
    // popular enough to be bundled in a third party lib, but not be part of
    // an AMD load request. Those cases could generate an error when an
    // anonymous define() is called outside of a loader request.
     // AMD范例导出
    if (typeof define == 'function' && define.amd) {
        define('underscore', [], function() {
            return _;
        });
    }

))
    原文作者:过北踏居
    原文地址: https://segmentfault.com/a/1190000018927950
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞