小情绪

文章 评论 浏览 631

小情绪 2022-05-04 13:54:36

HTTP/1.1是纯文本协议,将明文载荷和请求头传递给TCP。但对于TCP来说,上层传递的数据是不透明的字节流,无法区分是何种资源(不管上层传递的是js,css还是html,对于TCP来说都是一堆没有啥区别的字节流)。假设HTTP/1.1使用一个TCP连接来实现多路复用,现在要传输index.jsstyle.css两个文件,内容如下:

// index.js
function a() {console.log('a')}
function b() {console.log('b')}
// style.css
div { font-size: 18px; }
span { color: red; }
# index.js的请求头
HTTP/1.1 200 OK
Content-Length: 1000
# style.css的请求头
HTTP/1.1 200 OK
Content-Length: 600

注: 两个文件数据载荷+请求头混淆地穿插在一个TCP中(单个文件的数据载荷+请求头是有序的)。

浏览器在开始分析js时,期望有1000个字节(content-length),当接收到600个字节时,开始读取css文件,最终将css头部和一部分css内容当做js,TCP此时已经接收了2个包,第3个包传输剩余的css,由于第3个包已经没有了头部信息,浏览器直接扔掉。由于前面接收到的js不是有效的js内容,最终失败。

传输的3个包packet1, packet2, packet3,内容分别如下:

// packet1
HTTP/1.1 200 OK
Content-Length: 1000
function a() {console.log('a')}
// packet2
div { font-size: 18px; }
HTTP/1.1 200 OK
Content-Length: 600
// packet3 没有头部信息,被浏览器扔掉
function b() {console.log('b')}
span { color: red; }

最终packet1和packet2合成index.js交有浏览器处理
头信息为(index.js的头信息当做头信息,style.css的头信息当做index.js内容的一部分):

HTTP/1.1 200 OK
Content-Length: 1000

index.js:

function a() {console.log('a')}
HTTP/1.1 200 OK
Content-Length: 600
div { font-size: 18px; }

由于index.js不是有效的js文件,被浏览器扔掉,至此,没有正确请求到内容。

第 140 题:为什么 HTTP 1.1 不能实现多路复用

小情绪 2022-05-04 13:48:43

感觉用这个例子来引入惰性函数不是很适合

我们现在需要写一个 foo 函数,这个函数返回首次调用时的 Date 对象,注意是首次。

这个需求应该是用 once 函数实现比较好,不过 addEvent 的例子是适合惰性函数的。

function once(fn) {
  var fire, ret
  return function() {
    var self = this
    if (!fire) {
      fire = true
      ret = fn.apply(self, arguments)
    }
    return ret
  }
}

JavaScript 专题之 惰性函数

小情绪 2022-05-04 13:48:38

想问一下if([]){console.log("kkk")}里面又是什么转换过程呢?如果是要按false == [] 的话,后面的打印就不会执行,但是实际上后面的语句块的内容会执行

if 的转换规则和 == 不一样,if(xxx) 你可以看成 Boolean(xxx)

JavaScript 深入之类型转换(下)

更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文