开篇寄语
还在为 JavaScript 代码写得像“意大利面条”、逻辑混乱难以维护而头秃?收藏本文持续跟进,后续将系统分享 JS 高效语法糖、浏览器兼容与 Polyfill 实战、手写核心源码解析、常见坑点避雷指南,从基础语法到进阶逻辑一站式打通,助你快速提升前端开发硬实力。本系列文章将严格跟随 MDN 官方教程的节奏,从最基础的概念出发,一步步带你走进 JavaScript 的世界。今天是我们学习之旅的第一天,我们将从一个最根本的问题开始:JavaScript 到底是什么?
在正式开始之前,请你先放下对 JavaScript 的所有恐惧和偏见。无论你之前是觉得它“太简单不值一提”,还是觉得它“太复杂无从下手”,这篇文章都会让你重新认识这门语言。我们将站在一个较高的视角,俯瞰 JavaScript 的全貌,理解它的定位、它的能力边界,以及它如何与 HTML 和 CSS 协同工作。本文内容层层递进,每个小节都包含一个核心知识点,建议你按顺序阅读,并在阅读完毕后亲自动手实践文中的代码示例。
前提条件
在阅读本文之前,你需要具备一些基础的前置知识。首先是计算机的基本操作能力,包括文件的创建、保存、移动,以及浏览器的基本使用。其次,你需要对 HTML 和 CSS 有一个初步的理解。你不需要成为 HTML 或 CSS 的高手,但至少要知道什么是标签、什么是属性,以及 CSS 是如何给页面添加样式的。如果你对这些概念还比较陌生,建议先去 MDN 的学习区浏览一下 HTML 和 CSS 的基础教程,然后再回到这里继续学习。有了这些基础,你就能更好地理解 JavaScript 在整个 Web 技术体系中扮演的角色。
目标设定
本文的学习目标非常明确。第一,对 JavaScript 形成一个初步的整体认知,包括它是什么、能做什么、不能做什么。第二,理解 JavaScript 在网页中是如何工作的,以及它和 HTML、CSS 之间的关系。第三,掌握向网页中添加 JavaScript 代码的几种方式,并了解每种方式的适用场景和优缺点。第四,学会在 JavaScript 代码中编写注释,养成良好的编码习惯。这四个目标看似简单,但它们是后续所有深入学习的基础,务必认真对待。
高层定义:JavaScript 是什么
JavaScript 是一种脚本编程语言,它可以让网页实现复杂的功能。当网页展现给你的不再是简单的静态信息,而是实时的内容更新、交互式的地图、2D 或 3D 动画、滚动播放的视频等等,这背后几乎都有 JavaScript 的身影。它是构成标准 Web 技术的第三层,而另外两层分别是 HTML 和 CSS。
要理解这三层的关系,我们可以用一个人来做比喻。HTML 就像人体的骨架,它定义了网页的结构和内容,比如段落、标题、数据表格,以及嵌入的图片和视频。CSS 则像人体的皮肤和衣服,它将样式应用于 HTML 内容之上,比如设置背景颜色、调整字体、在多列中布局内容。而 JavaScript 则像人体的肌肉和神经系统,它让网页动起来,可以创建动态更新的内容、控制多媒体、制作图像动画,从而实现各种交互行为。
下面我们通过一个简单的按钮示例来看看这三层是如何依次叠加的。首先,我们用 HTML 创建一个按钮,赋予它结构和语义:
<buttontype="button">Player 1: Chris</button>此时在浏览器中你会看到一个没有任何样式的普通按钮,上面显示着“Player 1: Chris”的文字。这就是纯粹的 HTML 结构层。 接下来,我们为这个按钮添加一些 CSS 样式,让它变得好看一些: css button { font-family: "helvetica neue", helvetica, sans-serif; letter-spacing: 1px; text-transform: uppercase; border: 2px solid rgb(200 200 0 / 60%); background-color: rgb(0 217 217 / 60%); color: rgb(100 0 0 / 100%); box-shadow: 1px 1px 2px rgb(0 0 200 / 40%); border-radius: 10px; padding: 3px 10px; cursor: pointer; }应用这些样式之后,按钮的外观发生了显著变化,有了圆角、阴影、特定的字体和颜色。这就是 CSS 的表现层在发挥作用。
最后,我们再加上 JavaScript 来实现动态行为。当用户点击这个按钮时,会弹出一个对话框,让用户输入一个新的名字,然后按钮上的文字会实时更新:
constbutton=document.querySelector("button");button.addEventListener("click",updateName);functionupdateName(){constname=prompt("请输入新的名字");button.textContent=`Player 1:${name}`;}这个简单的例子完美地展示了三层技术是如何协作的。HTML 提供了结构(一个按钮),CSS 美化了外观,而 JavaScript 赋予了它交互能力。你可以把这个代码复制到自己的项目中运行一下,亲身体验这三层技术叠加之后的效果。
JavaScript 到底可以做什么
客户端 JavaScript 语言的核心包含了一些通用的编程特性,这些特性让你可以做到很多基础但重要的事情。首先,你可以在变量中储存有用的值。在上面的示例中,我们请求用户输入一个新名字,然后将其储存到名为 name 的变量中,供后续代码使用。其次,你可以操作文本字符串。比如我们把字符串“Player 1: ”和 name 变量拼接在一起,创造出完整的文本标签“Player 1: 小明”。再次,你可以运行代码来响应网页中发生的特定事件。在上面的例子中,我们使用 click 事件来检测按钮何时被点击,然后触发相应的代码来更新文本标签。
然而,JavaScript 真正的强大之处并不仅仅在于语言核心本身,更在于构建在语言核心之上的各种应用程序接口,也就是我们常说的 API。API 是已经预先建立好的一套代码组件,它可以让开发者实现原本很难甚至无法实现的程序。这就好比你想组装一个书柜,与其自己从零开始设计图纸、寻找木材、切割打磨、找到合适的螺丝再逐个组装,不如直接购买一套现成的家具套件,里面的木板已经按照标准尺寸裁切好,螺丝和安装说明一应俱全,你只需要按照步骤组装即可。API 就是程序世界里的这种“现成套件”。
API 通常分为两大类,理解这个分类对你后续的学习至关重要。
第一类是浏览器 API,它们内建于 Web 浏览器之中,可以从周围的计算机环境中提取数据,还可以完成各种实用的复杂工作。最典型的是文档对象模型 API,也就是 DOM API,它能通过创建、移除和修改 HTML 元素,为页面动态应用新样式等手段来操作 HTML 和 CSS。当你在页面上看到弹窗出现,或者有新的内容被动态添加进来,这就是 DOM API 在背后运行。此外还有地理位置 API,它可以获取你的地理信息,这也是为什么谷歌地图能够找到你的位置并在地图上标示出来。Canvas 和 WebGL API 则可以用来创建生动的 2D 和 3D 图像,很多令人惊叹的网页视觉效果都是借助这些 API 实现的。还有音视频类的 API,比如 HTMLMediaElement 和 WebRTC,它们让你可以在网页中直接播放音乐和视频,甚至调用你的网络摄像头进行实时录像。
第二类是第三方 API,它们并没有默认嵌入在浏览器中,你需要从网上去获取它们的代码和信息才能使用。比如 Twitter API 或新浪微博 API 可以让你的网站展示最新的推文或微博动态,谷歌地图 API、高德地图 API 则可以让你在自己的网站中嵌入定制化的地图。不过需要注意的是,第三方 API 属于进阶内容,在初学阶段我们不会深入涉及,你只需要知道它们的存在即可。等到你掌握了 JavaScript 的基础之后,可以再去学习客户端 Web API 模块,进一步拓展自己的能力边界。
JavaScript 在页面上做了什么
现在让我们更加深入地探讨一下,当浏览器加载一个包含 JavaScript 的网页时,背后到底发生了什么。你可以把浏览器想象成一家工厂,它接收的原材料就是 HTML、CSS 和 JavaScript 代码,经过加工处理后,最终产出的产品就是你眼前看到的那个网页。在这个过程中,JavaScript 的一个非常常见的用途就是通过 DOM API 来动态修改 HTML 和 CSS,从而更新用户界面。比如根据用户的操作显示或隐藏某个元素,改变某个区域的颜色,或者从服务器获取新数据并展示出来。
在理解 JavaScript 如何运行之前,我们需要先了解一个重要的概念:浏览器的安全机制。每个浏览器标签页都是其自身用来运行代码的独立容器,在专业术语中这被称为“运行环境”。在大多数情况下,每个标签页中的代码是完全独立运行的,一个标签页中的代码不能直接影响另一个标签页中的代码,更不能跨网站去操作另一个域名的内容。这是一个至关重要的安全措施,否则黑客就可以轻易地从其他网站盗取用户信息,或者进行各种恶意操作。当然,以安全的方式在不同网站或标签页之间传送代码和数据的方法是存在的,但它们属于进阶技术,在我们的基础课程中不会涉及。
接下来我们谈谈 JavaScript 的运行次序。当浏览器执行一段 JavaScript 代码时,通常会按照从上往下的顺序依次执行。这意味着你必须注意代码的书写顺序,否则就可能遇到意想不到的错误。让我们回顾一下前面按钮示例中的 JavaScript 代码:
constbutton=document.querySelector("button");button.addEventListener("click",updateName);functionupdateName(){constname=prompt("输入一个新的名字:");button.textContent=`玩家 1:${name}`;}这段代码的逻辑非常清晰。第一行通过 document.querySelector 方法选定了页面上的按钮元素,并将其引用存储在 button 变量中。第二行使用 addEventListener 方法为这个按钮绑定了一个点击事件的监听器,指定当点击事件发生时调用 updateName 函数。后面的函数定义则描述了 updateName 的具体行为:弹出一个输入框让用户输入新名字,然后将按钮上的文字更新为包含这个名字的新内容。
但是,如果你把前两行的顺序互换,就会出现问题。假设你写成这样:
button.addEventListener("click",updateName);constbutton=document.querySelector("button");functionupdateName(){constname=prompt("输入一个新的名字:");button.textContent=`玩家 1:${name}`;}当浏览器执行第一行代码时,button 这个变量还没有被声明和初始化,因此会抛出一个错误,在开发者控制台中你会看到类似“Uncaught ReferenceError: Cannot access ‘button’ before initialization”这样的提示。这个错误的意思是,在 button 对象被初始化之前,你不能去访问它,自然也就不能为它添加事件监听器。这是一个初学者非常容易犯的错误,请务必牢记:在使用一个变量之前,一定要确保它已经被正确地声明和赋值。
解释型语言与即时编译
作为编程学习者,你可能会经常听到两个术语:解释和编译。理解它们的区别有助于你更好地认识 JavaScript 的特性和运行方式。在传统的解释型语言中,代码自上而下运行,并且实时返回运行结果。代码在由浏览器执行之前,不需要被转化为其他任何形式,它直接以文本格式被接收并处理。相比之下,编译型语言则需要先将代码转换(也就是编译)成另一种形式才能运行。比如 C 和 C++ 程序需要先被编译成机器码,然后计算机才能执行这些二进制的指令。
JavaScript 被归类为轻量级的解释型语言。浏览器接收到 JavaScript 代码之后,会以其自身的文本格式来运行它。但从技术上说,几乎所有现代的 JavaScript 引擎都运用了一种叫做即时编译(Just-In-Time Compiling)的技术。这意味着当 JavaScript 源代码被执行的同时,它会被实时编译成二进制的格式,以便让代码运行得更快。尽管如此,我们仍然认为 JavaScript 是一门解释型语言,因为编译过程发生在代码运行的过程中,而不是在运行之前。这个话题如果展开来说会非常深入,在现阶段你只需要记住一个关键点:你写的 JavaScript 代码不需要经过一个单独的编译步骤,保存之后刷新浏览器就能看到效果。
在 Web 开发中,你还可能经常听到服务器端代码和客户端代码这两个术语。客户端代码指的是在用户电脑上运行的代码,当你浏览一个网页时,该网页的客户端代码会被下载到你的浏览器中,然后由浏览器来运行并展示结果。我们在本模块中讨论的主要内容就是客户端 JavaScript。而服务器端代码则是在服务器上运行的,运行完毕之后其结果才会被浏览器下载并展示出来。流行的服务器端 Web 语言包括 PHP、Python、Ruby、ASP.NET,甚至 JavaScript 本身也可以用作服务器端语言,比如现在非常流行的 Node.js 环境。这里有一个容易混淆的点需要澄清:JavaScript 既可以运行在浏览器端,也可以运行在服务器端,但它们的运行环境和使用场景是不同的。
与服务器端和客户端相关的还有动态页面和静态页面的概念。“动态”这个词既适用于客户端 JavaScript,也适用于描述服务器端语言。它指的是通过按需生成新内容来更新 Web 页面或应用,使得不同的情况下可以展示出不同的内容。服务器端代码会在服务器上动态生成新内容,比如从数据库中提取数据。而客户端 JavaScript 则在用户浏览器中动态生成新内容,比如创建一个新的 HTML 表格,用从服务器请求到的数据填充它,然后在页面中向用户展示这个表格。两种情况的意义略有不同,但又相互关联,而且在实际项目中两者经常协同工作。没有动态更新内容的网页叫做静态页面,无论谁来访问、无论何时访问,所显示的内容都完全相同。
向页面添加 JavaScript:内部方式
现在我们来学习如何将 JavaScript 代码添加到 HTML 页面中。与 CSS 类似,JavaScript 也有多种引入方式。CSS 可以使用 link 元素链接外部样式表,也可以使用 style 元素在 HTML 中嵌入内部样式表。而 JavaScript 只需要一种元素,那就是 script 标签。我们先从内部 JavaScript 开始学习。
内部 JavaScript 指的是将 JavaScript 代码直接写在 HTML 文件中的 script 标签内。这种方式适合代码量较少、逻辑相对简单的情况。下面我们通过一个实际的例子来演示。
首先,请在你的电脑上创建一个名为 apply-javascript.html 的文件,然后在文本编辑器中打开它。这个 HTML 文件会创建一个简单的网页,里面包含一个可点击的按钮。接下来,在你的文本编辑器中,找到 body 结束标签的位置,就在它之前添加以下内容:
<script>// 在此编写 JavaScript 代码</script>这里有一个非常重要的细节需要注意:我们把 script 标签放在了 body 结束标签之前,也就是整个文档的底部。之所以这样做,是因为 Web 文档中的代码通常是按照它们在页面上出现的顺序来加载和执行的。如果 JavaScript 代码在 HTML 元素之前加载和解析,那么当代码试图去操作那些还没有被加载的元素时,就会出现错误。把 JavaScript 放在底部,可以确保在脚本执行时,所有的 HTML 元素都已经完成了加载。
接下来,我们在 script 标签中添加一些真正能起作用的 JavaScript 代码。把“// 在此编写 JavaScript 代码”这一行注释替换为以下代码:
document.addEventListener("DOMContentLoaded",()=>{functioncreateParagraph(){constpara=document.createElement("p");para.textContent="你点击了按钮!";document.body.appendChild(para);}constbuttons=document.querySelectorAll("button");for(constbuttonofbuttons){button.addEventListener("click",createParagraph);}});这段代码的功能是:当页面上的任何一个按钮被点击时,都会在文档的底部添加一个新的段落,内容为“你点击了按钮!”。保存文件之后在浏览器中刷新页面,点击按钮试试看,你会发现每次点击都会出现一个新的段落。
这段代码虽然简短,但包含了好几个重要的概念。createParagraph 函数负责创建一个新的 p 元素,设置它的文本内容,然后将其添加到 body 的末尾。querySelectorAll 方法选择页面上的所有按钮,返回一个包含它们的列表。随后的 for 循环遍历这个列表,为每一个按钮都添加一个点击事件监听器,使得任意一个按钮被点击时都会触发 createParagraph 函数。DOMContentLoaded 事件则确保了整个脚本在 HTML 文档完全加载和解析之后才执行,这是一种更加稳妥的做法。
向页面添加 JavaScript:外部方式
内部 JavaScript 虽然方便,但在实际项目中,更推荐的做法是将 JavaScript 代码放在独立的外部文件中。这样做有很多好处:代码和 HTML 分离,结构更清晰,阅读和维护都更加方便;同一个 JavaScript 文件可以被多个 HTML 页面共享引用,避免了代码的重复编写。
我们来实际操作一下。首先,在你刚才创建的 HTML 文件所在的目录中,新建一个名为 script.js 的文件。请务必确保文件的扩展名是 .js,只有这样才能被识别为 JavaScript 代码。
接着,回到你的 HTML 文件,把之前添加在 body 底部的整个 script 元素都移除。然后在 head 结束标签之前添加以下内容:
<scripttype="module"src="script.js"></script>这里我们使用了 type=“module” 属性,这意味着浏览器会把这个脚本视为一个 JavaScript 模块。模块的一个重要特性是,浏览器会等待所有 HTML 内容都处理完毕之后再执行模块脚本,这样就不必担心脚本执行时 HTML 元素还没有加载的问题了。
然后,把之前内部 JavaScript 中的代码稍作调整,写入 script.js 文件中:
functioncreateParagraph(){constpara=document.createElement("p");para.textContent="你点击了按钮!";document.body.appendChild(para);}constbuttons=document.querySelectorAll("button");for(constbuttonofbuttons){button.addEventListener("click",createParagraph);}保存文件并刷新浏览器。此时你可能会发现点击按钮没有反应,如果你打开浏览器的开发者控制台,可能会看到类似“Cross-origin request blocked”的错误。这是因为 JavaScript 模块需要从与 HTML 同源的地方加载,而直接在本地文件系统中使用 file:// 协议打开 HTML 文件是不符合这个条件的。
解决这个问题有两种方法。第一种也是我们推荐的方法,是搭建一个本地测试服务器。你可以使用 Node.js 的 http-server 工具,或者 VS Code 的 Live Server 插件,又或者 Python 自带的简单 HTTP 服务器。启动服务器之后,在 8000 端口提供你的 HTML 和 JS 文件,然后通过 http://localhost:8000 这样的地址访问,一切就能正常工作了。
如果你暂时无法搭建本地服务器,也可以使用第二种替代方案:把 script 标签的 type=“module” 改为 defer,也就是写成这样:
<scriptdefersrc="script.js"></script>defer 属性的作用是告诉浏览器继续解析 HTML,同时异步下载 JavaScript 文件,等到 HTML 完全解析完成之后再执行脚本。这样也能确保脚本在 DOM 就绪之后运行。不过需要注意的是,我们后续教程中涉及的一些特性可能需要本地 HTTP 服务器才能正常工作,所以尽早搭建一个本地测试环境是很有必要的。
内联 JavaScript 处理器的陷阱
在学习 JavaScript 的过程中,你可能会在某些代码中看到一种直接在 HTML 标签中嵌入 JavaScript 的做法,这被称为内联 JavaScript 处理器。它看起来大概是这样的:
<buttononclick="createParagraph()">点我!</button>在 HTML 的 button 标签中,通过 onclick 属性直接指定了当按钮被点击时应该执行的 JavaScript 代码。配合的 JavaScript 函数定义如下: javascript function createParagraph() { const para = document.createElement("p"); para.textContent = "你点击了按钮!"; document.body.appendChild(para); }从功能上看,这种方式与之前使用 addEventListener 的写法效果完全一致。但我们需要在这里明确地告诉你:请不要使用这种方式。原因有二。
第一个原因是它将 JavaScript 代码混入了 HTML 结构之中,违反了关注点分离的原则。HTML 应该负责页面的结构和内容,CSS 负责页面的样式和布局,JavaScript 负责页面的行为和交互。把 JavaScript 代码直接写在 HTML 属性中,就好像把调味料直接倒进菜地里而不是在厨房里做菜,短期看好像省了事,长期看只会让整个项目变得难以维护。
第二个原因更加实际:使用内联事件处理器效率低下。想象一下,如果你的页面上有十个按钮、二十个按钮甚至更多,你需要为每一个按钮都手动添加 onclick 属性。而一旦需求发生变化,比如你改了一个函数的名字,你就需要在所有的 HTML 标签中逐个修改这个属性值。这显然是一种低效且容易出错的做法。
相比之下,使用 addEventListener 方法配合 querySelectorAll 的纯 JavaScript 方案要优雅得多:
constbuttons=document.querySelectorAll("button");for(leti=0;i<buttons.length;i++){buttons[i].addEventListener("click",createParagraph);}这段代码乍看上去比 onclick 属性的写法要长一些,但它只需要写一次,就可以对页面上所有的按钮生效。不管页面上的按钮数量是增加还是减少,JavaScript 代码都完全不需要修改。这种“用代码批量管理行为”的思路,是每一个合格的前端开发者都应该掌握的思维方式。
脚本加载策略
我们前面已经反复提到过代码加载顺序的重要性,这里再进行一次系统的总结。页面上的所有 HTML 代码都按照它们在文档中出现的先后顺序来加载。如果你打算用 JavaScript 去操作页面上的 DOM 元素,那么一定要确保在 JavaScript 执行时,这些目标元素已经被浏览器解析并加载到 DOM 树中了。如果 JavaScript 在目标 HTML 元素之前就被加载和解析了,你的代码将无法正常运行,因为此时你试图操作的对象还不存在。
有几种不同的策略可以确保 JavaScript 在 HTML 解析完成之后再运行。
第一种策略是将 script 标签放在文档正文的底部,也就是 body 结束标签之前。这样,浏览器会先解析完所有的 HTML 内容,然后才遇到并执行 JavaScript 代码。这是我们之前内部 JavaScript 示例中采用的方案,也是最简单直接的方法。
第二种策略是使用 script 标签的 type=“module” 属性。当浏览器识别到这是一个模块脚本时,它会自动等待整个 HTML 文档解析完成之后再去执行模块代码。这种方案的另一个好处是,你可以把 script 标签放在文档的头部,让浏览器更早地发现并开始下载脚本文件,从而提升加载效率。如果 HTML 内容较多或者网络速度较慢,把脚本放在头部并声明为模块,可以避免在文档底部才开始下载脚本所带来的延迟。
第三种策略是使用 defer 属性。如果你需要在文档头部使用非模块脚本,但又不想阻塞页面的渲染,可以在 script 标签上添加 defer 属性。defer 告诉浏览器继续解析 HTML,同时异步下载脚本文件,等 HTML 解析完全完成之后再按顺序执行这些延迟脚本。与之相关的还有 async 属性,区别在于 async 脚本会在下载完成后立即执行,不一定等待 HTML 解析完成,也不一定按照声明的顺序执行。如果你的脚本不依赖于 DOM 结构,也不依赖于其他脚本,async 是一个可选项。
对于内部脚本,如果你因为某些原因必须把它放在文档头部,可以使用 DOMContentLoaded 事件监听器来包裹你的代码:
document.addEventListener("DOMContentLoaded",()=>{// 你的代码写在这里});这样就能保证代码在 DOM 完全构建之后再执行。不过,这些策略对于大多数初学者来说已经超出了基础范围,除非你需要兼容非常老旧的浏览器,否则直接使用 type=“module” 就是当前最佳的实践。
注释:写给未来的自己
在 JavaScript 中,注释是被浏览器完全忽略的文本,它们不会被执行,唯一的读者就是阅读代码的人。也许是你自己,在半年之后回过头来维护这段代码时;也许是你的同事,在接手你的项目时。无论哪种情况,清晰的注释都能极大地降低理解的难度,减少沟通成本。
JavaScript 支持两种注释方式。第一种是单行注释,使用双斜杠开头:
// 我是一条注释双斜杠之后直到这一行结束的所有内容都会被当作注释处理。这种注释适合简短的说明,比如解释某一行代码的用途。
第二种是多行注释,使用斜杠星号开头,星号斜杠结尾:
/* 我也是 一条注释 */这种注释可以跨越多行,适合写较长的说明文字,比如对一个函数的整体功能描述,或者对一段复杂逻辑的详细解释。
让我们用注释来为之前按钮示例的代码添加一些说明,让代码的意图更加清晰:
// 函数:创建一个新的段落并添加至 HTML body 底部。functioncreateParagraph(){constpara=document.createElement("p");para.textContent="你点了这个按钮!";document.body.appendChild(para);}/* 1. 取得页面上所有按钮的引用并将它们置于一个数组中。 2. 通过一个循环为每个按钮添加一个点击事件的监听器。 当按钮被点击时,调用 createParagraph() 函数。 */constbuttons=document.querySelectorAll("button");for(constbuttonofbuttons){button.addEventListener("click",createParagraph);}通过添加这些注释,代码的阅读者(包括未来的你)可以迅速了解每一部分代码的用途,而不需要逐行分析语法细节。关于注释的数量,有一个原则值得记住:一般来说,注释越多越好,但如果某段代码需要大量的注释才能让人明白,那可能意味着变量命名不够直观,或者代码结构过于复杂。好的代码应该是自解释的,注释负责解释“为什么”,而不是“是什么”。
总结
恭喜你完成了 JavaScript 学习之旅的第一天。我们今天从最基础的理论出发,探讨了 JavaScript 是什么,它能做什么,以及为什么它是 Web 开发中不可或缺的一部分。我们通过一个按钮示例直观地感受了 HTML、CSS 和 JavaScript 三层技术是如何协同工作的。我们学习了 JavaScript 的核心能力,了解了浏览器 API 和第三方 API 的区别。我们深入探讨了 JavaScript 在页面中运行时的安全机制、执行顺序,以及解释型语言和编译型语言的概念差异。在实践层面,我们掌握了内部 JavaScript 和外部 JavaScript 两种引入方式,了解了内联事件处理器的缺陷,学习了脚本加载的几种策略,还养成了编写注释的好习惯。
现在你可能仍然觉得 JavaScript 有些令人生畏,这完全正常。任何一门语言的入门阶段都会有这种感觉,但请放心,在后续的课程中我们会循序渐进,每一步都建立在之前的知识基础之上。下一节我们将全力投入实战,让你亲手编写更多的 JavaScript 代码,在实践中巩固今天所学的内容。建议你在阅读下一篇文章之前,先把本文中的所有代码示例都自己敲一遍,运行一遍,甚至尝试修改一下,看看会发生什么。编程是一门手艺,只有动手才能真正掌握。我们下一篇文章再见。
还在为 JavaScript 代码写得像“意大利面条”、逻辑混乱难以维护而头秃?收藏本文持续跟进,后续将系统分享 JS 高效语法糖、浏览器兼容与 Polyfill 实战、手写核心源码解析、常见坑点避雷指南,从基础语法到进阶逻辑一站式打通,助你快速提升前端开发硬实力!