#啃underscore源码 一、root对象初始化部分

最近由于比赛要交了,以及工作室屯了各种项目,实在忙不过来刷题,所以很久没更blog了(良心痛),现在自己的水平还是渣代码堆砌 + 简单的增删改查(悲伤)

所以痛定思痛,决定之后的任务是先补学校课堂的知识(已经很久没有好好学习了),然后业余时间选择读一些源码&涉猎一些不同的应用场景(多看一点github项目)&刷题

所以开始了本月第一弹underscore源码解析部分


第一行代码:
var root = typeof self == 'object' && self.self === self && self || 
          typeof global == 'object' && global.global === global && global ||
          this ||
          {};

**问题: self是什么, self.self是什么, 有什么用?**
  1. 首先,self即是window.self,self变量在IIFE中没有声明,所以向上寻找,访问window对象。

    在MDN中,知道

    • window.self是“返回一个指向当前 window 对象的引用。”
    • window.self几乎总是用于下面示例那样的比较,用来判断当前 window 是不是父 frameset 中的第一个 frame。
    if (window.parent.frames[0] != window.self) {
        // 当前对象不是frames列表中的第一个时
     }
    

    应用: 我们总是能看到有网站左右两边挂了一些“不可描述”的图,用F12发现,他们基本上都是有一个iframe标签包裹,这种现象有可能是网站被劫持了。所以通过window.self的判断可以判断网站是不是被劫持

  2. self.self

    对于web页面,在默认情况下,以下4个写法都是相同的

    window === self                  // true
    window.window === window.self    // true
    window.self === self             // true
    window.window === self           // true
    

    通过这个判断来判断是不是浏览器环境

同理,global是node环境下对全局对象的引用,类似于第一句,是进行node环境的判断


收获:

1.比三目运算符更酷炫的赋值操作

var tmp = 条件1 && 条件2 && 条件3 && 目标值

2.知道了window.self的存在


参考网站:

https://juejin.im/entry/59b23dfe6fb9a0248e5cf724

http://www.zhangxinxu.com/wordpress/2017/07/js-window-self/

原文地址:https://www.cnblogs.com/kiznaiver1998/p/8831877.html