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

  • 相关阅读:
    48. Rotate Image
    47. Permutations II
    46. Permutations
    45. Jump Game II
    44. Wildcard Matching
    43. Multiply Strings
    42. Trapping Rain Water
    41. First Missing Positive
    40. Combination Sum II
    39. Combination Sum
  • 原文地址:https://www.cnblogs.com/webrtcPC/p/webrtc_connection_fifth.html
Copyright © 2011-2022 走看看