国庆节10月1日
--


JavaScript 是负责网页行为的脚本语言,由 ECMAScript、BOM、DOM 三部分组成;这篇讲清它和 Java 的区别,以及内部脚本、外部脚本、行内三种引入方式的写法与注意事项

前面 12 篇把网页的结构(HTML)和表现(CSS)都配齐了:页面能显示内容、也好看了,但它还是**“死的”**——点按钮没反应、数据不会变。让页面对用户的操作”活”起来,靠的是前端三件套里的第三门语言 JavaScript。这一篇先回答”JS 是什么、管什么”,再解决第一个动手问题:JS 代码写在哪里。
课程先回到 Web 标准那张图:
Web标准也称网页标准,由一系列的标准组成,大部分由 W3C(World Wide Web Consortium,万维网联盟)负责制定。
| 语言 | 负责 | 具体管什么 |
|---|---|---|
| HTML | 网页的结构 | 页面元素和内容 |
| CSS | 网页的表现 | 页面元素的外观、位置等页面样式,如颜色、大小等 |
| JavaScript | 网页的行为 | 交互效果 |
一句话:HTML 管”有什么”,CSS 管”长什么样”,JS 管”能干什么”。(这张图在 Web前端初识里出现过,这一篇开始真正用它。)
JavaScript(简称:JS)是一门跨平台、面向对象的脚本语言,是用来控制网页行为,实现页面的交互效果。JavaScript 和 Java 是完全不同的语言,不论是概念还是设计。但是基础语法类似。
三个定语说的是三件事:
| 定语 | 意思 |
|---|---|
| 跨平台 | 只要有浏览器就能跑,不用为 Windows、macOS 各写一份 |
| 面向对象 | 它用”对象”来组织代码和数据——自定义对象、DOM 里”把标签当对象处理”,都是这个特点的体现 |
| 脚本语言 | 不需要手动编译,写完直接由浏览器解释执行;改一行、刷新页面就能看到效果 |
JS 和 Java 只是名字像(历史原因),两家不同公司的两套设计:Java 是编译型的强类型语言,JS 是解释型的弱类型脚本语言。这门课后面写后端用的是 Java——别把两者的语法习惯互相硬套,尤其变量类型和相等判断(14 篇会专门对照)。
PPT 用一页把 JS 拆成了三块,这是理解后面所有内容的地图:
| 组成 | 全称 | 作用 | 典型例子 |
|---|---|---|---|
| ECMAScript | ECMA 的脚本语言标准 | 规定 JS 的基础语法核心知识 | 变量、数据类型、流程控制、函数、对象等 |
| BOM | Browser Object Model(浏览器对象模型) | 操作浏览器本身 | 页面弹窗、地址栏操作、关闭窗口等 |
| DOM | Document Object Model(文档对象模型) | 操作 HTML 文档 | 改变标签内的内容、改变标签内字体样式等 |
关于标准:
ECMA 国际(前身为欧洲计算机制造商协会)制定了标准化的脚本程序设计语言 ECMAScript,这种语言得到广泛应用。而 JavaScript 是遵守 ECMAScript 的标准的(ES2024 是最新版本)。
一句话记忆:ECMAScript 管”语法”,BOM 管”浏览器”,DOM 管”页面”。
内部脚本:将 JS 代码定义在 HTML 页面中——用 <script> 标签把 JS 代码包起来:
1<body>2 <!-- 页面内容 -->3
4 <!-- 内部脚本 -->5 <script>6 alert('Hello JS'); // 弹出一个警告框7 </script>8</body>PPT 上给这个方式总结了三句话:
<script></script> 标签之间;<script>;<body> 元素的底部,可改善显示速度。为什么放 body 底部?因为浏览器渲染页面是从上往下逐行解析(03 篇讲过)。脚本放在上面,页面内容还没渲染出来就先执行脚本,用户要多等一会儿才看到内容;放到 body 底部,页面内容先显示出来,再执行脚本——这就是”改善显示速度”。(到了 DOM 那部分还有第二个好处:脚本执行时页面元素已经存在,才拿得到它们。)
“任意地方、任意数量”说的是语法允许,不是”随便放都好”。多段脚本配合时要注意执行的先后顺序——浏览器从上往下解析,脚本写在前面的先执行(后面的综合题会让你亲自验证一次)。
外部脚本:将 JS 代码定义在外部 JS 文件中,然后引入到 HTML 页面中。
JS 文件里只放 JS 代码(课程文件 js/demo.js):
1alert('Hello JavaScript');HTML 页面里用 <script src=""> 把它引进来:
1<!-- 引入外部 JS 文件,src 写 JS 文件路径 -->2<script src="js/demo.js"></script>课程文件对照:01. JS-引入方式.html 里内部脚本被注释掉了,默认演示的是外部脚本(双击打开会弹出 Hello JavaScript);想试内部脚本,把注释拆掉、把外部脚本那行注释掉即可。
写的时候注意三条:
| 注意点 | 说明 |
|---|---|
src 写文件路径 | 相对路径 / 绝对路径都行,规则和 <img>、<video> 的 src 完全一样(见 HTML常见标签) |
| 标签里不要再写代码 | <script src="js/demo.js"> 里再写 JS 代码会被浏览器忽略,代码要写进 js 文件里 |
| 必须成对写结束标签 | 写成 <script src="js/demo.js"></script>;<script> 是双标签,不能像 <img> 那样自闭合 |
外部脚本最大的好处是复用:一个 js 文件可以被多个页面引入,改一处、所有页面都跟着变。页面一多,这一点就是”能不能维护”的分界线。
第三种写法是把 JS 直接写在标签上,靠”事件属性”触发:
1<!-- 点击按钮时执行一段 JS:弹窗 -->2<button onclick="alert('点我干什么')">点我一下</button>课程 PPT 只讲了内部脚本和外部脚本两种,行内方式属于补充(了解即可):代码一多就没法维护,而且把结构(HTML)和行为(JS)搅在一起,违背”结构、表现、行为分离”的做法。
| 方式 | 写法 | 代码放在哪 | 适合什么情况 |
|---|---|---|---|
| 内部脚本 | <script> JS 代码 </script> | 直接写在 HTML 页面里(一般 body 底部) | 代码很少、只有当前页面用 |
| 外部脚本 | <script src="js/demo.js"></script> | 单独的 .js 文件 | 代码多、多个页面共用(推荐) |
| 行内脚本 | 写在标签的事件属性里,如 onclick="..." | 标签上 | 了解即可,不推荐 |
结束符:每行结尾以分号结尾,结尾分号可有可无。
课程代码里每行都写了分号,跟着写就行。分号不写浏览器也能跑(它会自动补),但遇到多行连写、return 换行这类情况容易踩坑;统一写分号最省心,也方便以后写 Java(Java 的分号是必须的)。
| 问题 | 答案 |
|---|---|
| JS 是什么? | 一门跨平台、面向对象的脚本语言,控制网页行为、实现交互效果;和 Java 是完全不同的语言,只是基础语法类似 |
| Web 标准三件套各管什么? | HTML 管结构(页面元素和内容)、CSS 管表现(外观、位置等样式)、JS 管行为(交互效果) |
| JS 由哪三部分组成? | ECMAScript(基础语法)、BOM(操作浏览器)、DOM(操作 HTML 文档);ES2024 是最新版本 |
| 代码写在哪里? | 内部脚本写在 <script></script> 之间(一般放 body 底部);外部脚本单独成 .js 文件,用 <script src=""></script> 引入;行内脚本(了解)写在标签事件属性里 |
| 内部脚本放哪儿、放几个? | 语法上任意地方、任意数量,但推荐放 body 底部(先显示页面内容、再执行脚本) |
| 外部脚本的两个坑? | 标签里再写代码会被忽略;<script src=""> 不能自闭合 |
| 书写规范? | 每行结尾以分号结尾,分号可有可无 |
<script></script> 标签之间;HTML 文档里可以任意地方放任意数量的 <script>;一般把脚本放在 <body> 元素的底部,可改善显示速度<script src="js/demo.js"></script> 引入;src 的路径写法与 <img> 的 src 一样<script> 标签里再写 JS 代码会被忽略;这个标签必须成对闭合,不能像 <img> 那样自闭合onclick="alert('hi')");结构和行为混在一起,不推荐 2-1 用内部脚本让页面弹出一句话
写一个 HTML 页面,页面里有一行标题,然后在页面主体的底部加一段内部脚本:打开页面时弹出一个警告框,内容是 Hello JS。
写完自己回答一句:为什么不放在 head 里?
(练习文件 test_13_内部脚本.html 里已经给了骨架和写作区。)
一级 · 思路:JS 代码要包在一个专门的标签里;“弹出警告框”是脚本里的一行代码
二级 · 方法:用 <script> 标签包住 JS 代码;弹窗用 alert('内容')
三级 · 骨架:<body> → 页面内容 → <____>alert('____');</____> → </body>
1<!DOCTYPE html>2<html lang="zh-CN">3<head>4 <meta charset="UTF-8">5 <title>内部脚本</title>6</head>7<body>8 <h1>JS 引入方式 - 内部脚本</h1>9
10 <!-- 内部脚本:放在 body 底部 -->11 <script>12 alert('Hello JS'); // 弹出一个警告框13 </script>14</body>15</html>对照课程 01. JS-引入方式.html:课程里这段是被注释掉的(注释符 <!-- --> 包住了整个 <script> 标签),拆开注释就能看到弹窗。放 body 底部的原因:浏览器从上往下解析,页面内容先显示出来、脚本再执行,用户不用干等。
2-2 把弹窗代码拆到外部 JS 文件里 要求做两件事:
Hello JavaScripttest_13_外部脚本.html 和 test_13_外部脚本.js,两个文件放在同一目录。)一级 · 思路:JS 代码住在 .js 文件里,HTML 只负责”把它叫过来”
二级 · 方法:引入用 <script src="文件路径"></script>,路径是相对路径,和引入图片一样
三级 · 骨架:JS 文件里 alert('____');;HTML 里 <script ____="____.js"></script>
test_13_外部脚本.js:
1alert('Hello JavaScript');test_13_外部脚本.html:
1<!DOCTYPE html>2<html lang="zh-CN">3<head>4 <meta charset="UTF-8">5 <title>外部脚本</title>6</head>7<body>8 <h1>JS 引入方式 - 外部脚本</h1>9
10 <!-- 外部脚本:src 写 JS 文件的路径(同目录直接写文件名) -->11 <script src="test_13_外部脚本.js"></script>12</body>13</html>对照课程 01. JS-引入方式.html + js/demo.js:课程把 JS 文件放在 js/ 目录下,所以写 src="js/demo.js";这里两个文件同目录,所以直接写文件名。注意 <script src="..."> 要成对闭合,标签里不能写代码。
2-3 找出下面这段代码里引入方式的问题并改对
1<html>2<head>3 <title>JS引入方式</title>4 <script>5 alert('头部脚本');6 </script>7</head>8<body>9 <h1>Hello JS</h1>10 <script src="js/demo.js" />11 <script src="js/utils.js">12 alert('这行代码会执行吗');13 </script>14</body>15</html>要求:找出 2 处真错误和 1 处写法不推荐的地方,说明原因,并写出改正后的完整代码。
一级 · 思路:想一想 <script> 是双标签还是单标签;外部脚本的标签里写代码会怎样;脚本一般推荐放在页面的什么位置
二级 · 方法:双标签要写结束标签;引入外部脚本的标签里不能写代码;内部脚本一般放 <body> 底部
三级 · 骨架:<script src="js/demo.js">____</script> / <script src="js/utils.js">____</script> / 内部脚本挪到 </body> 前面
① 真错误:<script src="js/demo.js" /> 自闭合了。 <script> 是双标签,必须有结束标签,要写成 <script src="js/demo.js"></script>。
② 真错误:<script src="js/utils.js"> 标签里又写了 JS 代码。 引入外部脚本时,标签内的代码会被浏览器忽略——alert('这行代码会执行吗') 永远不会执行;这行代码要写进 js/utils.js 文件里。
③ 不推荐:内部脚本放在了 <head> 里。 语法上”任意地方”都能放,但放 head 里会在页面内容渲染之前就执行;一般放 body 底部。
改正后:
1<!DOCTYPE html>2<html lang="zh-CN">3<head>4 <meta charset="UTF-8">5 <title>JS引入方式</title>6</head>7<body>8 <h1>Hello JS</h1>9
10 <!-- 外部脚本:双标签,必须写结束标签 -->11 <script src="js/demo.js"></script>12
13 <!-- 外部脚本:标签里不写代码,代码写进 js/utils.js -->14 <script src="js/utils.js"></script>15
16 <!-- 内部脚本:移到 body 底部 -->17 <script>18 alert('页面底部脚本');19 </script>20</body>21</html>3-1 做一个”三种引入方式对照页” 把三种引入方式放进同一个页面,亲眼看看它们分别什么时候执行:
我是外部脚本body 的最上面用外部脚本引入这个文件三种 JS 引入方式我是行内脚本body 底部写一段内部脚本,弹出 我是内部脚本test_13_综合_引入方式对照页.html 给了骨架和写作区;外部 JS 文件 test_13_综合_引入方式对照页.js 在同一目录。)一级 · 思路:脚本的执行顺序 = 代码在页面里出现的顺序;行内方式还要多一个”用户操作”的条件
二级 · 方法:外部脚本 <script src="文件.js"></script>;行内 <button onclick="alert('...')">;内部 <script>alert('...')</script>
三级 · 骨架:<body> → <script src="____.js"></script> → <h1>____</h1> → <button ____="alert('我是行内脚本')">____</button> → <script>alert('____')</script> → </body>
test_13_综合_引入方式对照页.js:
1alert('我是外部脚本');test_13_综合_引入方式对照页.html:
1<!DOCTYPE html>2<html lang="zh-CN">3<head>4 <meta charset="UTF-8">5 <title>三种 JS 引入方式</title>6</head>7<body>8 <!-- ① 外部脚本:放在 body 最上面,是最先执行的脚本 -->9 <script src="test_13_综合_引入方式对照页.js"></script>10
11 <h1>三种 JS 引入方式</h1>12
13 <!-- ② 行内脚本:要等用户点击才执行 -->14 <button onclick="alert('我是行内脚本')">点我一下</button>15
16 <!-- ③ 内部脚本:放在 body 底部,最后执行 -->17 <script>18 alert('我是内部脚本');19 </script>20</body>21</html>第 6 步的答案:外部脚本先弹(它写在最上面),关掉它之后内部脚本接着弹(同一时刻按页面里的先后顺序执行);行内脚本要等你点按钮才弹。第 7 步的答案:外部脚本——代码只写一份,多个页面都能引入,改一处全站生效;写两遍就要维护两个地方,早晚会漏改一个。
如果你喜欢,那么欢迎来到我的世界!
了解更多暂未播放



"所有的相遇都是久别重逢。"—— 未知


