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

server/2024/9/24 6:29:21/

前言

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

事件

在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语句来实现。

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

2. 条件不成立时执行

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

javascript">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时检查这个条件。

javascript">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语句是另一种处理多条件判断的方法。它根据表达式的值选择执行哪个代码块。

javascript">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循环是最常用的循环语句之一,它会在指定的次数内重复执行代码块。

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

2. while 循环语句

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

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

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

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

javascript">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等)的元素。
     
    javascript">let array = [1, 2, 3, 4, 5];  
    for (let value of array) {  console.log(value); // 输出 1, 2, 3, 4, 5  
    }
  2. for...in 循环用于遍历对象的可枚举属性(包括原型链上的属性)。
javascript">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语句会跳过当前迭代,继续下一次迭代。

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

6. 终止循环(break)

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

javascript">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。这个错误告诉您正在尝试访问一个未定义的变量。

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

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

2. try...catch

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

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

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

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

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

结语

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

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

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

respect!


http://www.ppmy.cn/server/46407.html

相关文章

DxO PhotoLab 6 for Mac/Win:专业RAW图片编辑的利器

DxO PhotoLab 6 for Mac/Win是一款专为摄影师和摄影爱好者打造的专业RAW图片编辑软件&#xff0c;它将先进的技术、丰富的功能与直观的操作完美结合&#xff0c;为用户提供了一款全面而强大的图片处理工具。 一、技术领先&#xff0c;处理RAW图片更高效 DxO PhotoLab 6采用了…

Redis三种集群方式

文章目录 主从复制哨兵模式Redis Cluster集群codis与redis集群的区别Redis哨兵sentinel集群和Cluster集群区别红锁Redlock Redis有三种集群方式 主从复制&#xff0c;哨兵模式和Redis-Cluster集群。 主从复制 主从复制优缺点 优点&#xff1a; 支持主从复制&#xff0c;主机会…

基于FPGA的数字信号处理:Signed的本质和作用

基于FPGA的数字信号处理中,signed的本质和作用主要体现在对整型变量正负性的定义和运算上。以下是关于signed的详细解释: signed的本质 定义有符号数变量:在FPGA的数字信号处理中,signed关键字用于定义有符号整型变量。这意味着变量可以存储正数和负数,而不仅仅是无符号整…

第三章 Linux目标文件解析

解析目标文件内容&#xff1a;举例说明 //rootubuntu:/mnt/hgfs/share/019-proself/04# cat simplesection.c int printf(const char* format,...); int global_init_var84; int global_uninit_val; void func1(int i) {printf("%d\n",i); } int main(void) {static…

AI发展的探索与未来展望

随着科技的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;技术已经成为当今社会最热门的话题之一。从简单的自动化任务到复杂的决策支持系统&#xff0c;AI技术正以前所未有的速度改变着我们的世界。本文将深入探讨AI技术的发展历程、当前应用、面临的挑战以及未来的…

【二叉树】Leetcode 106. 从中序与后序遍历序列构造二叉树【中等】

从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postorder …

基于掩码自注意力机制的白内障手术后视力预测的不完整多模态学习

文章目录 Incomplete Multimodal Learning for Visual Acuity Prediction After Cataract Surgery Using Masked Self-Attention摘要方法实验结果 Incomplete Multimodal Learning for Visual Acuity Prediction After Cataract Surgery Using Masked Self-Attention 摘要 论…

Windows内核函数 - 添加、修改注册表键值

打开注册表的句柄后&#xff0c;就可以对该项进行设置和修改了。注册表是以二元形式存储的&#xff0c;即“键名”和“键值”。通过键名设置键值&#xff0c;而键值可以划分几个类&#xff0c;如下表所示。 表1 键值的分类 在添加和修改注册表键值的时候&#xff0c;要分类进行…