细说浏览器输入URL后发生了什么

 总体概览大体上,可以分为六步,当然每一步都可以详细都展开来说,这里先放一张总览图: DNS域名解析在网络世界,你肯定记得住网站的名称,但是很难记住网站的IP地址,因而也需要一个地址簿,就是DNS服务器。DNS服务器是高可用、高并发和分布式的,它是树状结构,如图: 根DNS服务器:返回顶级域DNS服务器的IP地址顶级域DNS服务器:返回权威DNS服务器的IP地址权威DNS服务器:返回相应主机的IP地址DNS的域名查找,在客户端和浏览器,本地DNS之间的查询方式是递归查询;在本地DNS服务器与根域及其子域之间的查询方式是迭代查询;递归过程: 在客户端输入URL后,会有一个递归查找的过程,从浏览器缓存中查找->本地的hosts文件查找->找本地DNS解析器缓存查找->本地DNS服务器查找,这个过程中任何一步找到了都会结束查找流程。如果本地DNS服务器无法查询到,则根据本地DNS服务器设置的转发器进行查询。若未用转发模式,则迭代查找过程如下图: 结合起来的过程,可以用一个图表示:在查找过程中,有以下优化点: DNS...

十分钟理解JavaScript引擎的执行机制

关注专栏写文章方伟景千锋前端开发推动市场提升的学习研究者。4人赞同了该文章首先,请牢记2点: JS是单线程语言JS的EventLoop是JS的执行机制。深入了解JS的执行,就等于深入了解JS里的eventloop 1.灵魂三问:JS为什么是单线程的?为什么需要异步?单线程又是如何实现异步的呢?技术的出现,都跟现实世界里的应用场景密切相关的。同样的,我们就结合现实场景,来回答这三个问题。(1)JS为什么是单线程的?JS最初被设计用在浏览器中,那么想象一下,如果浏览器中的JS是多线程的。场景描述:那么现在有2个进程,process1process2,由于是多进程的JS,所以他们对同一个dom,同时进行操作。process1删除了该dom,而process2编辑了该dom,同时下达2个矛盾的命令,浏览器究竟该如何执行呢?这样想,JS为什么被设计成单线程应该就容易理解了吧。(2)JS为什么需要异步?场景描述:如果JS中不存在异步,只能自上而下执行,如果上一行解析时间很长,那么下面的代码就会被阻塞。对于用户而言,阻塞就意味着"卡死",这样就导致了很差的用户体验所以,JS中存在...

JavaScript 引擎基础:Shapes 和 Inline Caches

hijiangtao​中国科学院大学计算机应用技术硕士260人赞同了该文章前言:本文也可以被称做“JavaScriptEngines:TheGoodParts™”,其来自Mathias和Benedikt在JSConfEU2018上为本文主题演讲所起的题目,更多JSconfEU2018上有趣的主题分享可以参考这个答案。本文就所有JavaScript引擎中常见的一些关键基础内容进行了介绍——这不仅仅局限于V8引擎。作为一名JavaScript开发者,深入了解JavaScript引擎是如何工作的将有助于你了解自己所写代码的性能特征。译者注:更多关于V8引擎、Chrome浏览器以及Node源码与背后细节的内容,推荐大家可以关注 @justjavac 大大的知乎专栏 V8、Chrome、Node.js 。回到本文的内容,全文共由五个部分组成:JavaScript引擎工作流程:介绍JavaScript引擎的处理流水线,这一部分会涉及到解释器/编译器的内容,且会分点介绍不同引擎间的差别与共同点;Jav...

this 的值到底是什么?一次说清楚

方应杭​杭州饥人谷教育科技有限公司CTO1,071人赞同了该文章你可能遇到过这样的JS面试题:varobj={foo:function(){console.log(this)}}varbar=obj.fooobj.foo()//打印出的this是objbar()//打印出的this是window请解释最后两行函数的值为什么不一样。-------初学者关于this的理解一直很模糊。今天这篇文章就要一次讲清楚了。而且这个解释,你在别的地方看不到。看懂这篇文章,所有关于this的面试题,都是小菜。有用请点赞。  首先需要从函数的调用开始讲起。JS(ES5)里面有三种函数调用形式:  func(p1,p2)obj.child.method(p1,p2)func.call(context,p1,p2)//先不讲apply  一般,初学者都知道前两种形式,而且认为前两种形式「优于」第三种形式。从看到这篇文章起,你一定要记住,第三种调用形式,才是正常调用形式:func.call(context,p1,p2)其他两种都是语法糖,可以等价地变为...

AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解

javascriptvue-clicommonjswebpackast 阅读约27分钟抽象语法树(AST),是一个非常基础而重要的知识点,但国内的文档却几乎一片空白。本文将带大家从底层了解AST,并且通过发布一个小型前端工具,来带大家了解AST的强大功能Javascript就像一台精妙运作的机器,我们可以用它来完成一切天马行空的构思。我们对javascript生态了如指掌,却常忽视javascript本身。这台机器,究竟是哪些零部件在支持着它运行?AST在日常业务中也许很难涉及到,但当你不止于想做一个工程师,而想做工程师的工程师,写出vue、react之类的大型框架,或类似webpack、vue-cli前端自动化的工具,或者有批量修改源码的工程需求,那你必须懂得AST。AST的能力十分强大,且能帮你真正吃透javascript的语言精髓。事实上,在javascript世界中,你可以认为抽象语法树(AST)是最底层。再往下,就是关于转换和编译的“黑魔法”领域了。小时候,当我们拿到一个螺丝刀和一台机器,人生中最令人怀念的梦幻时刻便开始了:我们把机器,拆成一...

JavaScript arguments对象

 1、在JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性。arguments非常类似Array,但实际上又不是一个Array实例。可以通过如下代码得以证实(当然,实际上,在函数funcArg中,调用arguments是不必要写成funcArg.arguments,直接写arguments即可)。1Array.prototype.testArg="test";2functionfuncArg(){3alert(funcArg.arguments.testArg);4alert(funcArg.arguments[0]);5}67alert(newArray().testArg);//result:"test"8funcArg(10);//result:"undefined""10"2、arguments对象的长度是由实参个数而不是形参个数决定的。形参是函数内部重新开辟内存空间存储的变量,但是其与arguments对象内存空间并不重叠。对于arguments和值都存在的情况下,两者值是同步的,但是针对其中一个无值的情况下,对于此无...
代码星球 代码星球·2020-04-10

pip知识点

 pip第三方模块保存在Libsite-packages目录安装第三方模块:Script目录下->shift+鼠标右点打开powershift窗口->pipinstall模块名称下载对应OS版本和Python版本的“PythonMagick”whl文件,然后CMD里面以“pip”+路径+whl完整文件名的方法安装。例如:pipinstallC:UsersStudentDesktopPythonMagick-0.9.12-cp35-none-win_amd64.whl...
代码星球 代码星球·2020-04-10

在 JavaScript 中为什么 typeof null 的结果是 object?

 java中的 null:既是对象,又不是对象,史称「薛定谔的对象」。 typeofnull==='object'; 、、//truenullinstanceofObject   //falsenullinstanceofObject===false而nullinstanceofnull会抛出异常:UncaughtTypeError:Right-handsideof 'instanceof'isnotan object这是一个历史遗留下来的feature(orbug?),Thehistoryof“typeofnull”在java的最初版本中,使用的32位系统,为了性能考虑使用低位存储了变量的类型信息:000:对象1:整数010:浮点数100:字符串110:布尔有2个值比较特殊:undefined:用-2^{30}(−2^30)表示。null:对应机器码的 NULL指针,一般是全零。在第一版的java实现中,判断类型的代码是这么写的:if(JSVAL_IS_VOID(v))...

什么是Git?

其实我在写这篇随笔的时候连Git是什么都不知道,只是听说过,也注册了一个GitHub的账号,但并不会玩.我也是查看了半天的网页才明白一个大概,但我觉得以后肯定会经常用到它.简单的来说,Git是一个分布式的版本控制系统。顾名思义,在你编辑程序代码的时候(特别是在多人协作一个项目时),它将会自动帮你实现代码以及版本的更新。这意味着你不必每次都手动地将自己修改的内容同步到云端。这些工作都可以由Git在适当的时候自动完成。这样既能避免手动同步的麻烦和风险,更能为程序员省下大量时间。百度官方解释:Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。Git是LinusTorvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。那版本控制系统又是什么呢?1.简单的来说就是,服务器端有个初始的空间存储的你的工程,我们称它为版本'A'.2.然后每一个开发者从服务器拷贝'A'到他们本地电脑的时候,由于他们会做不同的开发,所以本地的'A'版本就会发生变化.从而会有B,C...
代码星球 代码星球·2020-04-10

点击浏览器到返回经历了什么(详细解释)

1.用户输入url,浏览器内部代码将url进行拆分解析2.浏览器首先去找本地的hosts文件,检查在该文件中是否有相应的域名、IP对应关系,有,则向其IP地址发送请求没有,就会将domain(域)发送给dns(域名服务器)进行解析(解析如下图),  将域名解析成对应的服务器IP地址,发回给浏览器浏览器费了一顿周折终于拿到了服务器IP,接下来就是网络通信。分层由高到低分别为:应用层、传输层、网络层、数据链路层。发送端从应用层往下走,接收端从数据链路层往上走    首先:应用层客户端发送HTTP请求HTTP请求包括请求报头和请求主体两个部分,其中请求报头包含了至关重要的信息,包括请求的方法(GET/POST)、目标url、遵循的协议(http/https/ftp…),返回的信息是否需要缓存,以及客户端是否发送cookie等。 然后:传输层TCP传输报文位于传输层的TCP协议为传输报文提供可靠的字节流服务。它为了方便传输,将大块的数据分割成以报文段为单位的数据包进行管理,并为它们编号,方便服务器接收时能准确地...

JavaScript设计模式样例二十 —— 中介者模式

中介者模式(MediatorPattern)定义:用来降低多个对象和类之间的通信复杂性。目的:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。场景:MVC框架中的控制器C就是模型M和识图V的中介者。letmediator=(()=>{letmsg={}return{register:(type,action)=>{if(!msg[type])msg[type]=[]msg[type].push(action)},send:(type)=>{if(msg[type]){for(leti=0;i<msg[type].length;i++){msg[type][i]&&msg[type][i]()}}}}})()mediator.register('demo',()=>{console.log('first')})mediator.register('demo',()=>{console.log('second')})mediator.send('demo')Gi...

JavaScript设计式样例十九 —— 职责链模式

职责链模式(ChainofResponsibilityPattern)定义:为请求创建了一个接收者对象的链。目的:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。场景:红楼梦中的"击鼓传花"。//采购请求letPurchaseRequest=(amount,productName)=>{this.amount=amountthis.productName=productName}//处理方letApprover=(name,nextApprover)=>{this.name=namethis.nextApprover=nextApprover}Approver.prototype.processRequest=()=>{thrownewError()}//ConcreteHandlerletManager=(name,nextApprover)=>{Approver.call(this,name,nextApprover)}extend(Manager,Approver)Mana...

JavaScript设计式样例十八 —— 命令模式

命令模式(CommandPattern)定义:请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。目的:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。场景:在一个快餐店,用户向服务员点餐。服务员将用户的需求记录在清单上。letdialog={show(){console.log('showadialog')}}letanimation={start(){console.log('showanimation')}}letsetCommand=(btn,cmd)=>{btn.onclick=()=>{cmd.run()}}classShowDialogCommand{constructor(receiver){this.receiver=receiver}run(){this.receiver.start()}}classStartAnimationCommand{constructor(receiver){this.receiver=receiver}run(){this.rec...

JavaScript设计式样例十七 —— 迭代器模式

迭代器模式(ItratorPattern)定义:用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。目的:提供一种方法顺序访问一个聚合对象中各个元素,而又无须暴露该对象的内部表示。场景:$.each()for..of。leteach=(arr,callBack)=>{for(leti=0;i<arr.length;i++){if(callBack&&callBack(i,arr[i])===false){break;}}}letarr=[1,2,3,4]each(arr,(index,value)=>{if(value>2)returnfalseconsole.log(index,value)})Git地址:https://github.com/skillnull/Design-Mode-Example...

JavaScript设计式样例十六 —— 备忘录模式

备忘录模式(MementoPattern)定义:保存一个对象的某个状态,以便在适当的时候恢复对象。目的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。场景:数据缓存。letgetPageData=(()=>{letcache={}return(page,fn)=>{if(cache[page]){//已有指定缓存数据fun&&fn()}else{//当前没有指定缓存数据//获取指定数据datacache[page]=datafn&&fn()}}})()getPageData(1,()=>{//dosomthing})Git地址:https://github.com/skillnull/Design-Mode-Example...
首页上一页...368369370371372...下一页尾页