underscore-analysis icon indicating copy to clipboard operation
underscore-analysis copied to clipboard

root 对象初始化

Open zhangxiang958 opened this issue 8 years ago • 3 comments

从头开始阅读源码:

使用 IIFE

underscore 将所有函数封装在一个 IIFE 里面, 避免污染全局对象:

(function(){
    
}());

第一行代码:

var root = typeof self == 'object' && self.self === self && self || 
          typeof global == 'object' && global.global === global && global ||
          this ||
          {};

self

第一行代码就有所收获, self 是 window.self, self 属性是对窗口的自身的只读引用, 经常会使用 self 来代替 window 对象. 在防 HTTP 劫持的时候就会使用 window.top 是不是等于 window.self 来判断是不是被劫持了. 第一行的意思就是判断代码是不是在客户端下运行也就是 window 对象里面, 如果 self 是一个对象而且 self.self === self 的话那么就说明是在浏览器端, 就将 self 值传给 root, 相当于下面:

var root = typeof self == 'object' && self.self === self && self;

// var root = true && true && self;  
// ==> 
// var root = self;

global

global 是 node 环境下的全局对象的引用, 类似于 self, global.global === global 的话就说明是 node 环境下, 那么就是:

var root = typeof global == 'object' && global.global && global;

// var root = true && true && global; // ==> // var root = global;

this

如果都不是那么就是在其他的一些 js 环境里面比如 web worker, 你可以在浏览器里面试试, 打印出来的 this 是 worker 对象:

new Worker('console.log(this);');  //  Worker { onmessage: null, onerror: null }

所以 root 用这个 this 对象.如果最后连 this 对象都不存在, 那么就让 root 值为一个对象.

zhangxiang958 avatar Sep 06 '17 02:09 zhangxiang958

lodash都已经出到4.17.4了,为什么你这分析还是1.x的?

ghost avatar Sep 25 '17 09:09 ghost

@ningbo16 我阅读的是 underscore.js 的 1.8.3 版本哦,是目前 github 仓库最新的版本

zhangxiang958 avatar Sep 25 '17 10:09 zhangxiang958

尴尬,自己眼花了,我是自己想看下lodash的,下意识中把它俩当作一样的了

ghost avatar Sep 25 '17 13:09 ghost