浏览器工作原理(一)

1.前言 浏览器做了什么?

浏览器做的工作就是将我们输入的url变成一张位图BitMap。
BitMap传给计算机的显卡驱动设备,就转换成我们可以人眼可见的光信号。


image.png

浏览器将url变成一张BitMap,本篇主要解释基础的渲染流程部分,真正的浏览器工作比这个要复杂得多。
具体步骤:

  • http请求得到html页面:输入url发送一个http请求,解析http回应,得到url对应的html页面;
  • 对html进行文本分析,解析得到DOM树:对html文本进行parse解析,得到一个DOM树。
  • CSS Computing:经过css计算,DOM树上对应哪些css规则,对css规则叠加,css规则覆盖,进行计算,得到带样式的DOM树;
  • 布局产生css盒的位置,进行的一些位置的计算;
  • render渲染,给DOM树添加背景图和背景色。

2. 前置知识:有限状态机

2.1 状态机是什么?

有限状态机,又叫状态机。

每个状态都是一个机器

在每个机器里,我们可以做计算、存储和输出......
所有的机器接受的输入是一致的
状态机的本身没有状态,用函数表示的话,就是纯函数。

每个状态机知道下一个状态

有两种状态机:
Moore状态机:每个机器都有确定的下一个状态。
Mealy状态机:每个机器根据输入决定下一个状态(大多数比较实用)。

2.2 Js中的有限状态机(Mealy型)

   // 每个函数是一个状态
   function state(input){  // 函数参数就是输入
        // 在函数中,可以自由的编写代码,处理每个状态的逻辑
        // 返回值作为下一个状态
        return next;
    }

   // 调用部分
   while(input){
       // 获取输入
       state = state(input);  //把状态机的返回值作为下一个状态
   }

看到这里,不明白不要紧,往下看例子就知道咯....

2.2.1 一般方法解决字符输入查找

例:问题1:在一个字符串中找到字符‘a’, 怎么解?
我们可以这样:

  function find(string){
     for(let c of string){
          if(c==='a')
              return true;
     }
     return false;
  }
    
  let result = find("i am a girl",'a');
  console.log(result); // true

例:问题2:在一个字符串中找到字符‘ab’, 怎么解?

    function find(string){
        let foundA = false;  // 用一个变量标记a是否找到
        for(let c of string){
            if(c==='a')
                foundA = true;
            else if(foundA && c === 'b')   // 在找到a的基础上,找字符b
                return true;
            else  
                foundA = false;   // 如果a没有找到,或者找到a但是后面不是b,则表明ab没找到,将a的标记变量设置为false没找到
        }
        return false; // 循环结束没找到ab,则返回false
      }   
    
   let result = find("i am a girl bcd");
   console.log(result); // true

那问题3:在一个字符串中找到字符‘abcdef’, 怎么解呢?

同问题2,我们可以设置多个变量标识

    function find(string){
        let foundA = false;
        let foundB = false;
        let foundC = false;
        let foundD = false;
        let foundE = false;
        for(let c of string){
            if(c == 'a'){
                foundA = true;
            }else if(foundA && c === 'b'){
                foundB = true;
            }else if(foundB && c === 'c'){
                foundC = true;
            }else if(foundC && c === 'd'){
                foundD = true;
            }else if(foundD && c === 'e'){
                foundE = true;
            }else if(foundE && c === 'f'){
                return true;
            }else{
                foundA = false;
                foundB = false;
                foundC = false;
                foundD = false;
                foundE = false;
            }
        }
        return false
    }

    console.log(find("i am a abcjucabcdef")); // true
    console.log(find("i am a abcjucabdef")); // false

看到这里,我们下面尝试使用状态机实现字符查找

2.2.2 使用状态机解决字符输入查找

在一个字符串中找到字符‘abcdef’, 用状态机解决。
思路:

  • 找到字符'a'之前和之后,在for循环中的逻辑是完全不一样的,所以每找到我们要的一个字符,就去切换一个状态
   function find(string){
        let state =  start;  // state表示当前状态
        for(let c of string){
            state = state(c); //  将state执行的结果,也就是下一个状态赋给当前状态
        }
        return state === end;
    }

    function start(c){
        if(c ==='a'){
            return foundA;
        }else
            return start; 
    }

    // end状态永远返回end,叫做一个trap
    function end(c){  
        return end;
    }

    // foundA 找字符b
    function foundA(c){
        if(c ==='b'){
            return foundB;
        }else{
            return start(c); // 把当前字符传给start从新开始往后找,避免漏掉当前字符。
        }
    }
    
    // foundB 找字符c
    function foundB(c){
        if(c ==='c'){
            return foundC;
        }else{
            return start(c);
        }
    }

    // foundC 找字符d
    function foundC(c){
        if(c ==='d'){
            return foundD;
        }else{
            return start(c);
        }
    }

    // foundD 找字符e
    function foundD(c){
        if(c ==='e'){
            return foundE;
        }else{
            return start(c);
        }
    }

    // foundE 找字符f
    function foundE(c){
        if(c ==='f'){
            return end;
        }else{
            return start(c);
        }
    }

   console.log(find('abcdeabcdefsss')); // true

那用状态机怎么实现在字符串中查找'abababx' ?

// 状态机 处理字符串"abababx"

        function find(string){
            let state = start;
            for(let c of string){
                state = state(c);
            }
            return state === end;
        }

        function start(c){
            if(c === "a"){
                return foundA;
            }else{
                return start;
            } 
        }
        function end(c){
            return end;
        }

        function foundA(c){
            if(c === "b"){
                return foundB;
            }else{
                return start(c);
            }
        }

        function foundB(c){
            if(c === 'a'){
                return foundA2;
            }else{
                return start(c);
            }
        }
        function foundA2(c){
            if(c === 'b'){
                return foundB2;
            }else{
                return start(c);
            }
        }
        function foundB2(c){
            if(c === 'a'){
                return foundA3;
            }else{
                return start(c);
            }
        }
        function foundA3(c){
            if(c === 'b'){
                return foundB3;
            }else{
                return start(c);
            }
        }
        function foundB3(c){
            if(c === 'x'){
                return end;
            }else{
                return foundB2(c);
            }
        }



        console.log(find("i am abababx")); // true
        console.log(find("i am ababababx")); // true
        console.log(find("i am abcabcababx")); // false
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342