1、鏈接過程繼續解讀-----fun32解讀node
1.1 fun32.02web
"undefined" != typeof cordova && (N = !0, D = !0), navigator && navigator.userAgent && -1 !== navigator.userAgent.indexOf("Crosswalk") && (N = !0, D = !0); console.info('fun32.02==>2252==>2252');
注:關於函數中的逗號表達式,第一個逗號表達式執行完,無論它成立不成立,都要執行第二字逗號表達示,以最後一個逗號表達式生成的結果或真假爲準;但在同一個逗號表達式中,若是是&&鏈接的,若是第一個("undefined" != typeof cordova)不成立,就不會執行第二個((N = !0, D = !0))了。數組
1)第一行代碼瀏覽器
"undefined" != typeof cordova && (N = !0, D = !0),框架
注:"undefined" != typeof cordova這一句爲假,後面的(N = !0, D = !0)不執行了,由於&&鏈接的表達式,必須都爲真,整體的結果才爲真。這一行,包括如下的幾行,是判斷一對一的客戶端用沒用手機,而且用沒用crosswalk進行包裹,就是說webrtc代碼不只能夠跑在瀏覽器上,也能夠跑在crosswalk框架上。函數
2)第二至四行代碼spa
navigator && navigator.userAgent && -1 !== navigator.userAgent.indexOf("Crosswalk") && (N = !0, D = !0);
a.) navigator以下:3d
b.) navigator.userAgent以下:code
navigator.userAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36
c.) navigator.userAgent.indexOf("Crosswalk")以下:cordova
navigator.userAgent.indexOf("Crosswalk"): -1
注:沒查到Crosswalk,說明用的不是Crosswalk。這個判斷爲false,再也不往下執行。
1.2 fun32.03
var V = !N && (I || L);
注:V是false表示PC端不是IE瀏覽器,true表示PC端是IE瀏覽器。
1.3 fun32.04
V && "undefined" != typeof URL && (URL.createObjectURL = function() {});
1)V
V是false
2)typeof URL
URL是個函數
3)URL.createObjectURL
URL.createObjectURL是個函數
總的截圖以下:
注:總的來講,這一行仍是false,由於第一個就是false。
1.4 fun32.05
var W = (!!(window.process && "object" == typeof window.process && window.process.versions && window.process.versions["node-webkit"]), 50), B = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); console.info('fun32.05==>2263==>2263');
1)變量W
var W = (!!(window.process && "object" == typeof window.process && window.process.versions && window.process.versions["node-webkit"]), 50),
注:W裏面是個逗號表達式,!!通常用來將後面的表達式強制轉換爲布爾類型的數據(boolean),也就是隻能是true或者false;
var a; var b=!!a;
a默認是undefined。!a是true,!!a則是false,因此b的值是false,而再也不是undefined,也非其它值。
2)變量B
B = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);
注:B能匹配出三個變量。
1.5 fun32.06
D && B && B[2] && (W = parseInt(B[2], 10));
1)D
D:用於判斷是否是谷歌瀏覽器。
2)B
B是一個數組,若是是谷歌瀏覽器,它會產生三個元素。經過運行發現:D && B=B
3)B[2]
B[2]:64,表示安裝的是64位的瀏覽器。
注:此時,走到這一步了,結果就是64,即:D && B && B[2] = B[2],這創建在D,B都成立的狀況下。
4)W = parseInt(B[2], 10)
parseInt()函數,用於解析一個字符串,並返回一個整數。
注:因此W= parseInt(B[2], 10)= parseInt(64, 10)=60+4=64
因此整個表達式的值爲64
1.6 fun32.07
var F = 50; B = navigator.userAgent.match(/Firefox\/(.*)/), U && B && B[1] && (F = parseInt(B[1], 10)), window.addEventListener || (window.addEventListener = function(e, n, t) { e.attachEvent && e.attachEvent("on" + n, t) }), window.attachEventListener = function(e, n, t, o) { e.addEventListener(n, t, o) }; console.info('fun32.07==>2277==>2277');
1)var F = 50;
定義一個變量F,並賦值爲50.
2)B = navigator.userAgent.match(/Firefox\/(.*)/),
用於判斷是否爲火狐瀏覽器,輸出應該爲false爲空。截圖以下:
3)U && B && B[1] && (F = parseInt(B[1], 10)),
U爲false,不用往下看了,由上能夠B是null,也爲假。
4)監聽
window.addEventListener || (window.addEventListener = function(e, n, t) {
e.attachEvent && e.attachEvent("on" + n, t)
}),
注:這是一個監聽函數,但後面不知爲何,重定義了。用到時,再說吧。