前端日更一问

http与https的区别

什么是HTTP?

互联网应用最广泛的网络协议
作用:浏览器和服务器之间传输文档

什么是HTTPS?

是以安全为目标的HTTP通道
安全版的的HTTP
HTTPS = HTTP + SSL层
作用:1建立信息安全通道,保证传输安全2确认网站的真实性

区别:

1 https需要到ca申请证书(免费证书少,需要一定费用)
2 信息传输方式不同:
http是超文本传输协议,信息明文传输
https具有安全性的SSL加密传输协议

3 默认端口不同:
http:80;https:443
(什么是默认端口:
是web服务默认的端口
比如我们访问http://www.baidu.com的时候,
实际上是访问http://www.baidu.com:80 是一个标准,与浏览器无关,是服务器端的配置 )

4连接方式不同:
http:无状态的简单连接
https: 由http协议+SSL构建 可进行加密传输、身份认证的协议

变量提升与函数提升

变量提升

将 变量声明 提升到它所在作用域最开始的部分
a = 7; //初始化
console.log(a); //输出7
var a // 变量声明
*只提升变量声明,不会提升变量赋值

函数提升

将整个函数提升到最开始的部分
*只有函数声明才能够被提升,函数字面量不会进行函数提升

变量提升与函数提升的优先级:
函数提升 > 变量提升
且函数提升不会被变量声明覆盖,但是会被字面量赋值后覆盖

从输入url到页面呈现发生了什么?

整体流程

1.浏览器根据url查询ip
2.建立TCP连接
3.发送HTTP请求
4.服务器处理并返回http报文
5.浏览器解析渲染页面
6.关闭连接

浏览器根据url查询ip

DNS的定义:

域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。
--维基百科

  • 1.浏览器查询自己的DNS缓存
  • 2.查询操作系统中的DNS缓存(存储在系统运行内存中的缓存)
  • 3.查询操作系统的hosts文件(存储在本地硬盘中的hosts文件)
  • 4.查询路由器缓存(部分路由器会将访问过的域名缓存)
  • 5.查询ISP DNS缓存(互联网服务提供商)
  • 6.操作系统将域名发送到本地域名服务器(LDNS)进行DNS解析:

DNS解析就是查询当前url需要的资源在哪台机器上的过程
DNS解析实现了url->ip地址的转换

DNS解析是一个递归查询的过程
ex:www.baidu.com.
逐级查询,首先在本地域名服务器查询ip地址 ,如果没有
-> 本地服务器向.根域名服务器发送请求 , 如果没有
-> 本地服务器向com顶级域名服务器发送请求 , 如果没有
-> 本地服务器向baidu.com域名服务器发送请求 ->获取ip返回本地域名服务器
网址的解析是从右到左的过程:.->com->baidu.com->www.baidu.com

ps:
理论上所有域名查询都必须先查询根域名
关于根域名查询:.com .net .cn等顶级域名由不同机构管理,通过询问根域名列表可以得知某顶级域名由谁托管,从而继续进行查询。
根域名列表很少变化,大多数DNS服务商都会提供缓存
参考文档

建立TCP连接

发送HTTP请求

构建HTTP请求报文并通过tcp协议发送到服务器指定端口

http请求报文 = 请求行 + 请求头 + 空行 + 请求主体

  • 请求行:
    = 请求方法 + 请求路径 + 协议版本 (method + request-url + http-version)
  • 请求头:
    一般以键值成对存在,包含了请求的附加信息(如声明浏览器语言,请求正文长度等)
  • 空行:
    协议中规定请求头和请求主体间必须用一个空行隔开
  • 请求主体:
    对于post请求,所需要的参数都不会放在url中,这时候就需要一个载体了,这个载体就是请求主题。

服务器处理请求并返回http报文

服务器指定端口收到请求后,根据url匹配到的路径做相应的处理,最后返回浏览器需要的资源。
浏览器会接收到一个响应报文,而所需要的资源就就在报文主体上。

响应报文 = 响应行 + 响应头 + 空行 + 响应主体

响应行:
同样包含了协议版本,同时包含的还有状态码状态码的原因短语

浏览器解析渲染页面

手撕柯里化

add(x,y) {
    return x + y;
}

function curry(fn) {
     var outerargs=Array.prototype.slice.call(arguments,1);
     var outerargs = [...arguments];
     return function(){
         var innerargs=Array.prototype.slice.call(arguments);
         var finalargs=outerargs.concat(innerargs);
         fn.apply(null,finalargs)
         console.log(fn.arguments);
     }
}

var cur1 = curry(add, 8);
console.log(cur1(6));   //14

手撕函数节流防抖

目的:在不影响用户体验的前提下,将频繁出发的回调函数进行次数缩减,避免大量计算导致的页面卡顿

防抖

将多次执行变为最后一次执行
通俗理解:公交车,不断有人上车就不开车,一旦五分钟内都没有人再上车,就开车

应用场景:
频繁触发的事件且用户只关心最后一次操作所返回的结果
如:搜索联想,在用户不停输入时可用防抖节约资源
用户疯狂点击某个按钮,如点赞等 只生效最后一次即可

代码

window.onsize = () => fangdou();
var fangdou = debounce(func, 3000);
function debounce(func, timeout) { //要防抖的函数 延迟时间
    var timeout;
    return function() {
        clearTimeout(timeout);
        timeout = setTimeout(()=>{
            func.apply(this,arguments);
        }, timeout)
    }
}

节流

什么是节流?
将多次执行变为规定时间内只执行一次
通俗理解:公交车,五分钟发车一次

应用场景:
懒加载要监听计算滚动条的位置,使用节流按一定时间的频率获取。
用户点击提交按钮,假设我们知道接口大致的返回时间的情况下,我们使用节流,只允许一定时间内点击一次。

代码

window.onresize =()=> jieliu();
var jieliu = throttle(func,3000);
function throttle(func, timeout) {
    var doSomething = true;
    return function() {
        if(!doSomething)
            return;
        doSomething = false;
        setTimeout(() => {
            func.apply(this,arguments);
            doSomething = true;
        }, timeout);
    };
}

跨域问题

什么是跨域?

浏览器的同源策略导致-> 不能执行其他网站的脚本 -> 产生跨域问题

同源策略

是浏览器对JavaScript施加的安全限制
同源是指, 域名, 协议, 端口相同。

域名的组成

http://www.baidu.com :80 /dir/other.html ? xxxxx
协议 主机名 端口 文件路径 参数

跨域的方法

1.Jsonp

Jsonp是一种非正式传输协议
Jsonp = json + padding
利用

你可能感兴趣的:(前端)