JavaScript第五讲:事件,条件循环语句,错误处理

前言

在编程的世界里,事件、条件和循环语句、以及错误处理是构建任何复杂程序或应用的基石。无论是开发一个简单的网页交互,还是构建一个庞大的企业级系统,这些基础概念都扮演着至关重要的角色。今天星途将通过这篇文章,分别深入探讨“事件”、“条件语句”、“循环语句”、“错误处理”的核心概念、应用场景以及实践技巧,帮助大家更好地理解和掌握这些基础知识。若是有学过的大佬们可以收藏当作笔记看。

事件

在JavaScript中,"事件"是用户或浏览器与页面交互时触发的动作。这些动作可以是点击按钮、移动鼠标、提交表单、加载页面等。为了响应这些事件,JavaScript提供了事件处理程序(或称为事件监听器)。下面,我将从多个常见方面详细解释JavaScript中的事件,并配合代码进行演示。

1. 事件类型

JavaScript支持许多类型的事件,包括但不限于:

  • click: 用户点击元素时触发。
  • mouseovermouseout: 用户移动鼠标进入或离开元素时触发。
  • keydownkeyupkeypress: 用户按下、释放或按住键盘键时触发。
  • load: 页面或图片等资源加载完成时触发。
  • submit: 表单提交时触发。

2. 事件监听器

可以通过addEventListener()方法为元素添加事件监听器。这个方法接受两个参数:要监听的事件类型和一个事件处理函数。

示例:当用户点击一个按钮时,显示一个警告框。

<!DOCTYPE html>  
<html lang="en">  
<head>  <meta charset="UTF-8">  <title>事件示例</title>  
</head>  
<body>  <button id="myButton">点击我</button>  <script>  // 获取按钮元素  var btn = document.getElementById('myButton');  // 添加点击事件监听器  btn.addEventListener('click', function() {  alert('按钮被点击了!');  });  </script>  
</body>  
</html>

3. 事件冒泡和捕获

事件传播包括三个阶段:捕获阶段、目标阶段和冒泡阶段。默认情况下,事件监听器在冒泡阶段触发。但你可以通过设置addEventListener()的第三个参数为true来在捕获阶段触发监听器。

示例:演示事件冒泡

<!DOCTYPE html>  
<html lang="en">  
<head>  <meta charset="UTF-8">  <title>事件冒泡示例</title>  
</head>  
<body>  <div id="outer" style="padding: 50px; border: 1px solid black;">  外层div  <div id="inner" style="padding: 50px; border: 1px solid red;">  内层div  </div>  </div>  <script>  var outer = document.getElementById('outer');  var inner = document.getElementById('inner');  outer.addEventListener('click', function(event) {  console.log('外层div被点击了');  }, false); // 默认为false,即冒泡阶段  inner.addEventListener('click', function(event) {  console.log('内层div被点击了');  // 阻止事件冒泡到外层div  // event.stopPropagation();  }, false);  </script>  
</body>  
</html>

4. 事件对象

当事件触发时,会传递一个事件对象作为参数给事件处理函数。这个对象包含了与该事件有关的所有信息,如触发事件的元素、鼠标位置、键盘按键等。

示例:获取鼠标在元素上点击时的位置。

btn.addEventListener('click', function(event) {  console.log('鼠标X坐标:', event.clientX);  console.log('鼠标Y坐标:', event.clientY);  
});

5. 移除事件监听器

使用removeEventListener()方法可以移除之前添加的事件监听器。这个方法需要两个参数:要移除的事件类型和事件处理函数。

示例

function handleClick() {  alert('按钮被点击了!');  // 移除事件监听器  btn.removeEventListener('click', handleClick);  
}  btn.addEventListener('click', handleClick);

注意:在removeEventListener()中,事件处理函数必须是与添加时相同的引用。如果是匿名函数,则无法移除。

条件语句

1. 条件成立时执行

当条件成立(即条件为true)时,执行相应的代码块。这通常使用if语句来实现。

let x = 10;  if (x > 5) {  console.log("x 大于 5");  
}  
// 输出: x 大于 5

2. 条件不成立时执行

如果if语句中的条件不成立(即条件为false),并且你希望在这种情况下执行一些代码,你可以使用else语句。

let y = 3;  if (y > 5) {  console.log("y 大于 5");  
} else {  console.log("y 不大于 5");  
}  
// 输出: y 不大于 5

3. 多条件判断 - else if

当你有多个条件需要判断时,可以使用else if语句。else if语句允许你指定另一个条件,并在第一个if语句的条件为false时检查这个条件。

let z = 7;  if (z < 5) {  console.log("z 小于 5");  
} else if (z === 5) {  console.log("z 等于 5");  
} else {  console.log("z 大于 5");  
}  
// 输出: z 大于 5

4. 多条件判断 - switch

switch语句是另一种处理多条件判断的方法。它根据表达式的值选择执行哪个代码块。

let fruit = "apple";  switch (fruit) {  case "banana":  console.log("我喜欢香蕉");  break;  case "apple":  console.log("我喜欢苹果");  break;  case "orange":  console.log("我喜欢橙子");  break;  default:  console.log("我不确定这是什么水果");  
}  
// 输出: 我喜欢苹果

switch语句中,每个case值都会与表达式的值进行比较。如果找到匹配的case,就会执行相应的代码块,直到遇到break语句(如果没有break,会执行所有后续的case,直到遇到breakswitch语句结束)。如果表达式的值与任何case都不匹配,就会执行default代码块(如果存在的话)。

注意:在switch语句中,case的值必须是常量表达式,不能是变量或复杂的表达式。同时,尽管JavaScript会尝试将case的值和表达式的值转换为相同的类型进行比较,但最好还是保持它们类型一致以避免潜在的问题。

循环语句

1. for 循环语句

for循环是最常用的循环语句之一,它会在指定的次数内重复执行代码块。

for (let i = 0; i < 5; i++) {  console.log(i); // 输出 0, 1, 2, 3, 4  
}

2. while 循环语句

while循环会在指定的条件为true时重复执行代码块。

let i = 0;  
while (i < 5) {  console.log(i); // 输出 0, 1, 2, 3, 4  i++;  
}

3. do...while 循环语句,至少执行一次

do...while循环与while循环类似,但不同之处在于它会先执行一次代码块,然后再检查条件。因此,无论条件是否为true,代码块至少会执行一次。

let i = 0;  
do {  console.log(i); // 输出 0, 1, 2, 3, 4  i++;  
} while (i < 5);

4. 增强型循环语句(for...of, for...in)

  1. for...of 循环用于遍历可迭代对象(如数组、Map、Set等)的元素。
     
    let array = [1, 2, 3, 4, 5];  
    for (let value of array) {  console.log(value); // 输出 1, 2, 3, 4, 5  
    }
  2. for...in 循环用于遍历对象的可枚举属性(包括原型链上的属性)。
let obj = { a: 1, b: 2, c: 3 };  
for (let key in obj) {  console.log(key); // 输出 "a", "b", "c"(可能还包括原型链上的属性)  
}  // 注意:使用for...in时,通常建议检查对象自身属性,而非原型链上的属性  
for (let key in obj) {  if (obj.hasOwnProperty(key)) {  console.log(key); // 输出 "a", "b", "c"  }  
}

5. 继续下一次循环(continue)

在循环中使用continue语句会跳过当前迭代,继续下一次迭代。

for (let i = 0; i < 10; i++) {  if (i % 2 === 0) {  continue; // 跳过偶数  }  console.log(i); // 输出 1, 3, 5, 7, 9  
}

6. 终止循环(break)

在循环中使用break语句会立即终止循环。

for (let i = 0; i < 10; i++) {  if (i === 5) {  break; // 当i等于5时,终止循环  }  console.log(i); // 输出 0, 1, 2, 3, 4  
}

错误处理

当在JavaScript中编程时,错误处理是非常重要的一部分。以下是从您提到的两个方面(调用不存在的函数和try...catch)详细解释JavaScript错误处理。

1. 调用不存在的函数

当您尝试调用一个不存在的函数时,JavaScript会抛出一个错误,通常是ReferenceError。这个错误告诉您正在尝试访问一个未定义的变量。

示例代码:
// 假设我们没有定义这个函数  
functionDoesNotExist(); // 这里会抛出 ReferenceError  // 为了处理这种错误,我们通常会在调用函数之前检查它是否存在  
if (typeof functionDoesNotExist === 'function') {  functionDoesNotExist();  
} else {  console.error('函数 functionDoesNotExist 不存在');  
}

但是,这种检查方法在实际编程中并不常见,因为通常我们知道哪些函数是存在的。如果您收到关于不存在的函数的错误,那通常是因为您可能拼写错误,或者忘记定义该函数。

2. try...catch

try...catch语句用于捕获和处理JavaScript中的运行时错误。当try块中的代码抛出错误时,控制流会立即转移到catch块,在那里您可以处理错误。

示例代码:
try {  // 尝试执行可能会出错的代码  let x = y; // y 没有定义,这将抛出 ReferenceError  
} catch (error) {  // 当 try 块中的代码抛出错误时,这里会捕获并处理错误  console.error('捕获到错误:', error);  
}  // 程序会继续执行 catch 块之后的代码  
console.log('程序继续执行');

在上面的例子中,我们尝试访问一个未定义的变量y,这将导致ReferenceError。但是,由于我们使用了try...catch语句,这个错误被捕获并打印到控制台,而不是导致整个程序崩溃。

try...catch语句也可以与finally块一起使用,无论是否发生错误,finally块中的代码都会执行。这通常用于执行清理操作,如关闭文件或释放资源。

try {  // 尝试执行可能会出错的代码  let x = y; // y 没有定义,这将抛出 ReferenceError  
} catch (error) {  // 当 try 块中的代码抛出错误时,这里会捕获并处理错误  console.error('捕获到错误:', error);  
} finally {  // 无论是否发生错误,这里的代码都会执行  console.log('finally 块中的代码');  
}

结语

经过对“事件”、“条件语句”、“循环语句”、“错误处理”这四方面内容的深入学习和探讨,相信您已经对它们有了更加全面和深刻的理解。这些基础知识不仅是编程的基石,也是解决复杂问题的关键。

在实际开发中,我们需要根据具体的需求和场景,灵活地运用这些基础知识,构建出高效、稳定、易维护的程序。同时,我们也需要不断地学习和探索新的技术和方法,以应对日益复杂的编程挑战。

希望这篇文章能够为您的编程之路提供有益的指导和帮助。在未来的学习和实践中,愿您能够不断地进步和成长,成为一名优秀的开发者。

respect!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/845956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中判断String类型为空和null的方法

1.判断一个String类型的变量是否为空&#xff08;即长度为0&#xff09;或者为null 在Java中&#xff0c;判断一个String类型的变量是否为空&#xff08;即长度为0&#xff09;或者为null&#xff0c;通常需要使用两个条件语句来进行检查。这是因为null表示变量没有引用任何对…

01PCB设计概述

PCB设计概述 EDA electronic design automatic 电子设计自动化&#xff08;利用计算机来实现电子设计&#xff09; 分为 &#xff1a; 微电子&#xff08;芯片设计&#xff09;、硬件板卡&#xff08;PCB设计&#xff09; 画原理图、画PCB布线 要会绘制原理图库、和封装图库 元…

计算机组成原理06:浮点数运算

浮点数加减运算 之前我们提到过&#xff0c;浮点数具有特定的表示形式。因此&#xff0c;在进行浮点数的加减运算之前&#xff0c;需要统一浮点数的表达方式。这里我们主要对浮点数表示中的尾数M进行处理&#xff0c;要求0≤M<1&#xff0c;统一格式如下&#xff1a; 正数…

在Ubuntu下安装配置和调优iptables的终极指南

嘿&#xff0c;大家好&#xff01;今天我要和大家分享一篇关于在Ubuntu下安装配置和调优iptables防火墙的技术博客。废话不多说&#xff0c;我们直接切入主题。 首先&#xff0c;我要强调一下&#xff0c;今天我在阿贝云免费服务器上进行了部署测试。我得说&#xff0c;这个免…

LeetCode84:柱形图中最大的矩形

题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 代码 单调栈 class Solution { public:int largestRectangleArea(vector<int>& h…

React@16.x(16)Render Props

目录 1&#xff0c;问题描述2&#xff0c;解决方式2.1&#xff0c;Render Props2.2&#xff0c;HOC 3&#xff0c;使用场景 1&#xff0c;问题描述 当使用组件时&#xff0c;标签中的内容&#xff0c;会被当做 props.children 来渲染&#xff1a; 子组件&#xff1a; import…

AI 学习神器!大学生必备的 22个 AI 提示词模板

AI 学习神器&#xff01;大学生必备的 22个 AI 提示词模板 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘…

6. MySQL 查询、去重、别名

文章目录 【 1. 数据表查询 SELECT 】1.1 查询表中所有字段使用 * 查询表的所有字段列出表的所有字段 1.2 查询表中指定的字段 【 2. 去重 DISTINCT 】【 3. 设置别名 AS 】3.1 为表指定别名3.2 为字段指定别名 【 5. 限制查询结果的条数 LIMIT 】5.1 指定初始位置5.2 不指定初…

基于优化Morlet小波的一维信号瞬态特征提取方法(MATLAB R2018A)

小波分析方法近些年逐步得到发展的一门数学分析技术&#xff0c;它对许多学科都有十分重要的影响。与傅立叶变换等其他传统方法相比&#xff0c;小波分解的方法中所用的小波基有着多种多样的结构&#xff0c;总结来说又包括正交小波系与非正交小波系。正交小波在信号处理领域目…

自动化测试:selenium详解(建议收藏)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 说到自动化测试&#xff0c;就不得不提大名鼎鼎的Selenium。Selenium 是如今最常用的自动化测试工…

系统思考—思考快与慢

“膝反射思考做决策&#xff0c;你的公司能走多远&#xff1f;” 在快节奏的商业环境中&#xff0c;我们的大脑往往默认采用“快速直觉反应”模式来做决策&#xff0c;这种方式节省能量&#xff0c;属于我们认知的“系统一”。然而&#xff0c;仅依靠直觉反应&#xff0c;即所…

cleanmyMac有必要吗,什么软件可以替代clean my mac

最近总有苹果用户抱怨mac电脑变得非常卡顿&#xff0c;而且总会收到“您的启动磁盘几乎已经满了”的系统提示。提示出现的原因是我们长期未对电脑进行健康扫描和深度清理导致的。遇到这种情况&#xff0c;我们可以借助专业的电脑深度清理软件——CleanMyMac X&#xff0c;清理不…

Django中使用Celery和APScheduler实现定时任务

在之前的文章我们已经学习了Celery和APScheduler的基本使用&#xff0c;下面让我们来了解一下如何在Django中使用Celery和APScheduler Celery 1.前提工作 python 3.7 pip install celery pip install eventlet #5.0版本以下 pip install importlib-metadata4.8.3&#xff08…

从功能性磁共振成像(fMRI)数据重建音频

听觉是人类最重要的感官之一&#xff0c;它负责接收外部的听觉刺激&#xff0c;并将这些信息传递给大脑进行处理和理解。研究人员正致力于从神经科学和计算机科学两个领域探索人脑的听觉感知机制。一个关键目标是从人脑中解码神经信息&#xff0c;并重建原始的刺激。常见的大脑…

【上海大学计算机组成原理实验报告】六、内存系统实验

一、实验目的 学习内存访问机制。理解代码和数据的分区存放原理和技术。 二、实验原理 根据实验指导书的相关内容&#xff0c;地址寄存器MAR用来存放要进行读或写的存储器EM的地址。其内容经数据总线DBUS写入&#xff0c;因此必须在数据总线上具有数据后&#xff0c;配合MAR允…

认识微服务,认识Spring Cloud

1. 介绍 本博客探讨的内容如下所示 什么是微服务&#xff1f;什么是springcloud&#xff1f;微服务和springcloud有什么关系&#xff1f; 首先&#xff0c;没有在接触springcloud之前&#xff0c;我写的项目都是单体结构&#xff0c; 但随着网站的用户量越来越大&#xff0c;…

编译 libpng zlib mozjpeg libjpeg-turbo 失败的解决方法

使用vcpkg 进行下载 在使用vcpkg安装这些库之前&#xff0c;请确保你已经正确安装并配置了vcpkg。以下是在Windows环境下&#xff0c;使用vcpkg安装libpng, zlib, mozjpeg, 和 libjpeg-turbo的命令序列。这些命令假设你已经在命令行中进入了vcpkg的根目录。 安装zlib: vcpkg i…

队列的特性及代码实现(C语言)

目录 队列的定义 队列的实现分析 代码实现 Queue.h Queue.c 队列的定义 队列是只允许在一端进行插入操作&#xff0c;而在另一段进行删除操作的线性表。 首先&#xff0c;让我们来看一看生活中的队列&#xff0c;当我们去银行办理业务的时候&#xff0c;我们进入银行的时候…

Python的第三方库OS库

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;OS/SHUTIL 的方法描述&#x1f680;OS/SHUTIL…

Golang 协程和 Channel 的协同工作

在 Golang 中&#xff0c;协程&#xff08;goroutine&#xff09;和通道&#xff08;channel&#xff09;是并发编程的两大支柱。协程是一种轻量级的线程&#xff0c;而通道则是协程之间进行通信的管道。在本文中&#xff0c;我们将通过一个简单的示例来深入理解它们是如何协同…