zoukankan      html  css  js  c++  java
  • webrtc底层一对一连接过程探索(五)

    一、fun38

    1.1 fun38.09

    注:fun38先走的是以上代码,需要逐行解析。

    1)解释一下

    !function(){}这个写法和(function(){})是一个意思。所以,上来先执行这个函数。

    2)代码段一

    "undefined" == typeof window &&

    注:经测试,window的类型是object,不是未定义,"undefined" == typeof window不成立,所以,&&后面的就不执行了。以下截图是我做的一个实验,就是说单独的这个函数,也能执行出一大串。

    1.2 fun38.10

    1)fun38.10完整代码如下:

    2)代码段一

    var c = window.navigator;

    注:window.navigator打印如 下:

    3)代码段二

    void 0 !== c ? (void 0 !== c.webkitGetUserMedia && (c.getUserMedia = c.webkitGetUserMedia), 
    void 0 !== c.mozGetUserMedia && (c.getUserMedia = c.mozGetUserMedia)) : 
    c = {
      getUserMedia: function() {},
      userAgent: d
    };

    a.) 这是一个问号表达式,若成立,则执行冒号前面的,不成立则执行冒号后面的。

    注:从上面的截图中,可以看出c不是undefined,所以void 0 !== c为true。所以,接下来,要执行如下代码:

    void 0 !== c.webkitGetUserMedia &&
    
    (
    
    c.getUserMedia = c.webkitGetUserMedia),
    
    void 0 !== c.mozGetUserMedia &&
    
    (c.getUserMedia = c.mozGetUserMedia)
    
    )

    b.) void 0 !== c.webkitGetUserMedia

      注:不知为什么,c.webkitGetUserMedia是存在的,而且还是个函数,所以void 0 !== c.webkitGetUserMedia为true。如下:

    接下来,把c.webkitGetUserMedia赋给c.getUserMedia。接下来,还要进行一个赋值,如下:

    c.mozGetUserMedia,但测试发现,c.mozGetUserMedia是未定义的,这是判断火狐浏览器的,所以不往下走了。

    4)代码段三如下:

    a.) 变量u

    var u = !!/Android|webOS|iPhone|iPad|iPod|BB10|BlackBerry|IEMobile|Opera Mini|Mobile|mobile/i.test(c.userAgent || ""),

    注:判断一下是不是安卓,苹果,iPad等,发现不是。经测试,u为false。

    b.)变量l和f

       l = !(-1 === c.userAgent.indexOf("Edge") ||
    
    !c.msSaveOrOpenBlob && !c.msSaveBlob),
    
       f = !!window.opera || c.userAgent.indexOf(" OPR/") >= 0,

    注:经测试,l和f均为false.l是判断是不是edge浏览器,f是判断是不是opera浏览器。

    c.)变量m和p

    m = void 0 !== window.InstallTrigger,
    
    p = Object.prototype.toString.call(window.HTMLElement).indexOf("Constructor") > 0,

    注:!==的优先级高于=,所以m是用于判断装没装window触发器。p用于判断有没有window.HTMLElement,结果是都没有,如下:

     

    图11

    d.) 变量v和g

       v = !!window.chrome && !f,
    
       g = !!document.documentMode && !l,

     

    图12

    注:!!window.chrome用于判断是不是谷歌浏览器,是返回true,不是返回false,!!类似于双重否定,v表示是否为谷歌浏览器,g用于判断是否为Edge浏览器。

    e.) 变量h

     

    图13

    注:h是一个函数集合,如下:

     

    图14

    f.) 变量w和S

      w = "Unknown OS",
    
      S = "Unknown OS Version";

    注:w和S是两个字符串,用于标识不知道的操作系统和操作系统版本。

    5)代码段四

      if (h.any()) w = h.getOsName();
      else {
        var C = i();
          w = C.osName,
          S = C.osVersion
       }

    a.) h.any()

     函数h.any()如下:

      any: function() {
    
          return h.Android() || h.BlackBerry() || h.iOS() || h.Opera() || h.Windows()
    
      },

     注:因为用的是谷歌浏览器,所以返回空。因此if为假,要走else了。

    b.) else

      else {
    
        var C = i();
    
        w = C.osName,
    
        S = C.osVersion
    
      }

     

    图15

    注:else中调用了i()函数,而i()正好是fun38.05,接下来要研究fun38.05。

    1.2 fun38.05

    1)本阶段完整代码

    图16

     

    图17

    图18

    2)代码段一

      for (var r in i) {
         var s = i[r];
         if (s.r.test(t)) {
            o = s.s;
            break
         }
      }

    注:fun38.05主要用于判断,你用的设备是什么设备,是手机还是台式机,如果台式机是什么系统,用fun38.05能判断出我用的操作系统win10。

     

    图19

    注:第一个r=0,s=i[0]= { s: "Windows 10",r: /(Windows 10.0|Windows NT 10.0)/},

    s.r=/(Windows 10.0|Windows NT 10.0)/,

    而t=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36,所以s.r.test(t)为true,test()是js中内置的一个函数,具体如下:

     

    图20

  • 相关阅读:
    快学scala习题解答--第五章 类
    从头认识java-18.2 主要的线程机制(2)-Executors的使用
    关于Bootstrap的理解
    Raw-OS源代码分析之idle任务
    Scilab 的画图函数(3)
    HDU2586.How far away ?——近期公共祖先(离线Tarjan)
    Codeforces Round #311 (Div. 2) A,B,C,D,E
    presto访问 Azure blob storage
    Presto集群安装配置
    Presto架构及原理
  • 原文地址:https://www.cnblogs.com/webrtcPC/p/webrtc_connection_fifth.html
Copyright © 2011-2022 走看看