带你读书之“红宝书”:第二章HTML中的JavaScript

简介: 带你读书之“红宝书”:第二章HTML中的JavaScript

写在前头

大多数小伙伴看技术书籍都会用“啃”来描述读书的直观感受,当然我也是一个前端小白,白的透明那种,但是我在读技术书籍感觉到“啃”的时候,我希望把我啃红宝书第四版的过程的想法,总结带给大家,以供后来者能够更快上手。

注: 本文由于作者水平原因,如有错误之处,恳请大家指正,另外随着学习的深入,体会的加深,我会不断回来更新,修改这类文章。


思维导图

微信截图_20221111174858.png


脉络


本章节介绍的顺序


  1. script的八大属性 p11
  2. 行内脚本 (行内脚本的执行方式,还有结束问题)p12
  3. 外部脚本 (src属性,不同文档中的书写模式)p12
  4. 外部JavaScript扩展名不确定(不一定必须是.js)p13
  5. src属性使用的注意点 p13
  6. <script> 元素特性 p13
  7. 标签位置 p13
  8. 推迟执行脚本 p14
  9. 异步执行脚本 p14
  10. 动态执行脚本 p15
  11. XHTML中代码的书写改变 p16
  12. 废弃的语法 p17
  13. 行内代码和外部文件 p18
  14. 文档模式 p18 15  <noscript> 元素 p19


1. script的六大属性 p11

在看着6大<script>元素的属性时,初学者往往感觉头疼,脑子一篇茫然就接触这一堆不明所以的知识,让人难受。


1. async (异步下载)在看这个属性是的先了解一下同步,异步,单线程,多线程的一些基本概念。 打个比喻:食堂打饭。 单线程:一个阿姨负责一个窗口,打了菜(一件事),还得打饭(下一件事)。 就是一个人做一件事之后才可以做下一件事情。 多线程:把学生用餐视为一个任务,这个任务分为打饭和打菜2个事情,叫阿姨A在窗口A负责打饭,(打完饭,阿姨A把盘子给阿姨B)阿姨B在窗口B负责打菜。


核心:单线程 , 一个任务从头至尾由一 线程 完成,在一个任务完成之前,不接受第二个任务。(一个阿姨打饭又打菜),多线程 , 将一个任务拆分成不同的阶段(部分),并交给不同的 线程 分别处理。(阿姨A打饭,阿姨B打菜)。


同步: 学生在阿姨没有打菜之前,可以苦等,只有打完饭之后才可以打菜。 异步: 学生在阿姨A打完菜之后,可以在阿姨B的打饭空隙找一个位置。


核心:学生不用傻等,可以抽空做点其他事。 同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行。


我估计有人已经看懵了,不过没关系,暂时知道JavaScript不会傻傻的死等就行。

回过头就是 JavaScript在渲染页面时,还不忘记下载脚本。


2. charset

这个属性开发中很少用到,一般出现乱码时,会使用。


3.crossorigin

这玩意目前我也不知道干啥的(初学小白)


4.defer

意思就是延长执行脚本,但是只对外部脚本起作用。怕加载脚本浪费大量时间,于是把渲染界面的任务提前,让执行脚本这事延期。


5.integrity

确保内容分发网络,不会提供恶意内容。


6. language

这个属性已经被废弃,实际开发不会使用,是历史产物,因为过去JavaScript版本太多。


7. src

学过html都知道html文档引用外部css文件。有一个src。还有就是图片标签<img>也有src。 这是开发中使用最多的属性,其实它就是代表一个地址。(可以是外部文件地址,可以是URL)。


src属性主要作用是连接js文件。src对应连接的文件不一定是js文件。 当src对应的文件后缀名不是js时,是kgp或者其他的,这是因为在某些特殊的情况下,我们需要动态的去上传一些js


8.type

用于代替language属性,如果你在html中正常的插入script标签,默认使用text/JavaScript这种形式。


MIME : 多功能Internet邮件扩展,是用来控制浏览器与服务器之间传输的一种形式。 设置动态js时会用到, 当MIME类型为application/x-JavaScript会返回默认XHTML模式。


2. 行内脚本 (行内脚本的执行方式,还有结束问题)p12

<script>内的代码会从上到下解释。 js中会对函数式的东西预编译,进行预处理,然后把它所需要定义的这个东西,找个地方把他保存起来。 虽然把函数的运行写在上面,然后把函数的定义写在下面,但是运行的时候,这个函数内部的东西仍然会执行。


JavaScript运行原理:

js 是有一个预处理的过程,预处理完了之后再执行,整个预处理加执行,是一个阻断式的操作。只有预处理加执行放在一起,才是js从上至下的解释。


js运行机制: 众人皆停,我独行。js是一种阻断式语言。


JavaScript运行原理:从上至下,按照代码块进行预处理和执行。


// 声明a 但是不赋值
var a;
consle.log(a); // undefined
复制代码


// 声明a 但是赋值
var a = 1;
consle.log(a); // 1
复制代码


// 如果同时进行
var a;
consle.log(a); // undefined
// 声明a 但是赋值
a = 1 ;
consle.log(a); // 1
复制代码


// 如果是函数?
  function a() {
        };
    console(a()); // 123
  function a() {
console.log('123');
        };
复制代码


结束问题

遇到字符串</script> 必须使用转义字符“\”,并且得放入内部

console.log("<\/script>");
复制代码


3. 外部脚本 (src属性,不同文档中的书写模式)p12

要包含外部文件必须使用src属性。


书写模式

<script src="example.js"></script>
复制代码


XHTML文档里面是可以忽略结束标签

<script src="example.js"/>
复制代码


4. 外部JavaScript扩展名不确定(不一定必须是.js)p13

一旦链接的不是.js文件需要对这个返回的文件的type类型做一下定义。


5. src属性使用的注意点 p13

使用了src属性,最后不要再使用行内JavaScript代码。如果使用浏览器会忽略行内JavaScript代码。


6. <script> 元素特性 p13

src属性可以引用来自外部域的js文件,用法类似<img>元素。 但是在用外部域的js文件时需要考虑安全性,integrity属性就是器到防范作用的。


7. 标签位置 p13

浏览器会根据<script>在页面的出现位置来判断执行先后(没有添加其他属性的前提)。 当<script>标签放在<head>标签里面,会比<body>标签里面的代码先解析并执行。 如果<script>标签放在<body>标签里面,并且在页面代码的后面,那么页面的代码先解析并执行。


总结:在没有其他<script>属性的干扰下,JavaScript或从上到下依次执行代码。


8. 推迟执行脚本 p14本小段详解defer属性。

<!DOCTYPE html>
<html>
  <head>
    <title>Example HTML Page</title>
    <script defer src="example1.js"></script>
    <script defer src="example2.js"></script>
  </head>
  <body>
    <!-- 这里是页面内容 -->
  </body>
</html>
复制代码


总结:

  1. 延期执行脚本,既然不愿意把<script>标签放在页面代码后面,使用defer就可以起到延期执行的作用,让后面的页面代码等等“插队”。
  2. 不同版本可能会有不支持的作用,XHTML文档书写格式有变化。
  3. example1.js 比 example2.js 文件大的话,在IE中可能example2.js会比example1.js 先执行。


9. 异步执行脚本 p14

<!DOCTYPE html>
<html>
  <head>
    <title>Example HTML Page</title>
    <script async src="example1.js"></script>
    <script async src="example2.js"></script>
  </head>
  <body>
    <!-- 这里是页面内容 -->
  </body>
</html>
复制代码


总结: 就是脚本下载的时候不会中断HTML解析,一旦脚本文件下载完成,就立刻停下HTML解析,执行脚本,在脚本执行完毕后在继续。


比方

刷剧-HTML解析 削苹果-脚本下载 吃苹果-脚本执行 换句话说,就是你女朋友在刷剧,你在削苹果,你削完苹果,她立刻停止刷剧,吃掉苹果,之后继续刷剧。


10. 动态执行脚本 p15

不再老套的使用<script>标签。 自己“造一个”。

const script = document.createElement('script');
script.src = 'gibberish.js';
script.async = false;
document.head.appendChild(script);
复制代码


在创建完毕之后,这种<script>标签,会自带async属性。可以手动去除这个属性。

script.async = false;
复制代码


11. XHTML中代码的书写改变 p16

平时不怎么用,了解就行。 像小于符号等等这个在XHTML中必须使用HTML实体形式(&lt);


CDATA块

<![CDATA[代码..]]> // 第一种
//<![CDATA[代码..//]]> // 第二种
复制代码


12. 废弃的语法 p17

废弃的还学干嘛,了解看看就行。

<script><!--代码... //-->></script>
复制代码


13. 行内代码和外部文件 p18

推荐使用外部文件,让开发更加方便,逻辑有条理。 可维护性:要改哪里,打开那个js文件改就行,不用去找对应的html页面代码。 缓存:就是买一朵花,送个几个女生,一花多用。“呸,我是渣男”。 适应未来:不用考虑不同文档代码的书写模式,比如上面XHTML里面的CDATA块等等。


14. 文档模式 p18

包含三种模式:混杂模式(quirks mode)标准模式(standards mode)准标准模式(almost standards mode)


15  <noscript> 元素 p19

使用条件:浏览器不支持脚本,浏览器被禁用脚本。

当浏览器支持脚本时, <noscript> 元素中的代码永远不会被执行。





目录
相关文章
|
1月前
|
JavaScript 前端开发
【快捷键配置】常用HTML类名、CSS样式名称、JS方法变量名、vue代码片段
【快捷键配置】常用HTML类名、CSS样式名称、JS方法变量名、vue代码片段
|
1月前
|
JavaScript 前端开发
用JavaScript正则表达式匹配对应字符串高亮显示,并过滤掉空格、<、>等HTML节点符号
用JavaScript正则表达式匹配对应字符串高亮显示,并过滤掉空格、<、>等HTML节点符号
|
14天前
|
JavaScript 前端开发
JavaScript DOM 文档对象模型(获取、改变html元素)
JavaScript DOM 文档对象模型(获取、改变html元素)
|
15天前
|
前端开发 JavaScript
使用html+css+javaScript 完成计算器
使用html+css+javaScript 完成计算器
|
18天前
|
前端开发 JavaScript
前端 富文本编辑器原理——从javascript、html、css开始入门(二)
前端 富文本编辑器原理——从javascript、html、css开始入门
28 0
前端 富文本编辑器原理——从javascript、html、css开始入门(二)
|
18天前
|
前端开发 JavaScript 索引
前端 富文本编辑器原理——从javascript、html、css开始入门(一)
前端 富文本编辑器原理——从javascript、html、css开始入门
37 0
|
18天前
|
JavaScript 前端开发 BI
原生html—摆脱ps、excel 在线绘制财务表格加水印(html绘制表格js加水印)
原生html—摆脱ps、excel 在线绘制财务表格加水印(html绘制表格js加水印)
20 1
|
25天前
|
前端开发 JavaScript
在HTML中,我们可以使用JavaScript变量
【4月更文挑战第19天】在HTML中,我们可以使用JavaScript变量
16 2
|
25天前
|
JavaScript 前端开发
在JavaScript中怎样获取或修改HTML元素。
在JavaScript中怎样获取或修改HTML元素。
|
25天前
|
前端开发 JavaScript
JavaScript 获取 HTML 元素
JavaScript 获取 HTML 元素