javascript闭包传参和事件的循环绑定示例探讨

yizhihongxing

JavaScript闭包传参和事件的循环绑定示例探讨

本文将深入探讨JavaScript中闭包传参和事件的循环绑定问题,包括闭包的概念及传参方式、事件的循环绑定方式,以及两个实例。

1. 闭包

1.1 闭包的概念

实际上闭包是一种函数,它可以访问其它函数内层变量的函数,同时保留这些变量的值。简单地说,闭包就是一个能够读取其他函数内部变量的函数。

1.2 闭包的传参方式

闭包内部所引用的的变量,一般是父级作用域中的变量,由于父级作用域中的变量无法被直接访问,所以我们必须通过传参的方式将其传递进来。

以下是一个闭包传参的例子:

function outerFunction() {
  var name = "张三";
  function innerFunction() {
    console.log(name);
  }
  return innerFunction;
}

var fn = outerFunction();
fn(); //输出:张三

1.3 闭包传参示例

以下是一个将参数传递给闭包的示例:

function greeting(name) {
  return function() {
    console.log(`你好,${name}!`);
  };
}

var greetTom = greeting("Tom");
greetTom(); // 输出:你好,Tom!

在这里,我们定义了一个greeting函数,它接受一个参数name,这个参数被传递给闭包内部的匿名函数中,作为该函数内部console.log()的输出值。

2. 事件的循环绑定

2.1 循环绑定的问题

在循环中为多个元素绑定同一事件处理程序时,最常见的一个错误是,它们都将绑定到相同的变量,这是因为在 JavaScript 中,在循环内部声明的函数都共享同一个作用域。

以下是循环中绑定事件处理程序的错误示例:

for(var i = 0; i < 5; i++) {
  var btn = document.createElement("button");
  btn.appendChild(document.createTextNode(`按钮${i}`));
  btn.onclick = function() {
    console.log(`你点击了按钮${i}!`);
  };
  document.body.appendChild(btn);
}

上述示例将循环绑定了5个按钮的点击事件处理程序,现在看上去没问题,但是当我们在点击任意一个按钮时,控制台输出的都是“你点击了按钮5!”,这是因为循环中所有按钮的点击事件都被绑定到了变量i上,而当循环执行完毕时,变量i的值为5,因此在任何时候点击按钮都会输出5。

2.2 解决循环绑定的问题

为了解决循环绑定处理程序的问题,我们需要将每个按钮的点击事件分别绑定到不同的变量上。这时候闭包就能派上用场了。

以下示例展示了通过闭包来解决循环绑定问题的方法:

for(var i = 0; i < 5; i++) {
  var btn = document.createElement("button");
  btn.appendChild(document.createTextNode(`按钮${i}`));

  (function(index) {
    btn.onclick = function() {
      console.log(`你点击了按钮${index}!`);
    };
  })(i);

  document.body.appendChild(btn);
}

在上面的例子中,我们用一个自执行的匿名函数将每个按钮的索引传递进去,使得每个按钮的点击事件都被绑定到了不同的变量上。

3. 实例

3.1 示例一:监听事件绑定

以下是一个监听事件绑定的实例:

var btn = document.getElementById("myButton");
btn.addEventListener("click", function() {
  console.log("你点击了我的按钮!");
}, false);

在上面的例子中,我们通过addEventListener方法为btn按钮添加了一个点击事件监听器。当按钮被点击时,对应的回调函数会被触发并输出信息。

3.2 示例二:鼠标移动监听

以下是一个用闭包传参和循环绑定的例子:

for (var i = 0; i < 5; i++) {
  var div = document.createElement("div");
  div.style.width = "50px";
  div.style.height = "50px";
  div.style.backgroundColor = "gray";
  div.style.margin = "10px";
  div.style.float = "left";
  div.style.cursor = "pointer";
  div.style.opacity = 0.5;

  (function(index) {
    div.onmouseover = function() {
      this.style.opacity = 1;
      console.log(`你把鼠标移动到了第${index+1}个方块上!`);
    }
    div.onmouseout = function() {
      this.style.opacity = 0.5;
    }
  })(i);

  document.body.appendChild(div);
}

在上面的例子中,我们使用onmouseoveronmouseout事件来分别监听鼠标移动到方块上和移出方块的情况,并且通过闭包来传递索引参数,实现了循环绑定。当我们将鼠标移动到某个方块上时,该方块会变得半透明,同时控制台会输出相应信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript闭包传参和事件的循环绑定示例探讨 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • JavaScript绑定事件监听函数的通用方法

    请看下文详细讲解“JavaScript绑定事件监听函数的通用方法”: 1. 什么是事件 在 Web 开发中,事件是用户与网页交互的重要部分。例如,用户单击按钮,提交表单等都是事件。 2. 事件绑定 2.1 addEventListener 方法 addEventListener() 方法是 JavaScript 中绑定事件的主流方法,它的语法如下: elem…

    JavaScript 2023年6月11日
    00
  • jQuery Validate表单验证入门学习

    jQuery Validate表单验证入门学习 简介 jQuery Validate是一个基于jQuery的表单验证插件,它能够快速方便地实现表单验证功能,提高用户输入数据的准确性。 安装 在使用jQuery Validate进行表单验证前,首先需要引入jQuery库和jQuery Validate插件,可以在HTML文件中通过CDN或下载本地文件来引入。 …

    JavaScript 2023年6月10日
    00
  • javascript绘制漂亮的心型线效果完整实例

    下面是详细讲解“javascript绘制漂亮的心型线效果完整实例”的完整攻略。 1. 前期准备 在绘制心型线前,我们需要有基本的html文件和css样式文件。html文件中需要添加一个canvas标签,而css样式设置canvas标签为画布,并赋予宽度和高度。代码如下: <!DOCTYPE html> <html lang="en…

    JavaScript 2023年6月10日
    00
  • Javascript Date setFullYear() 方法

    以下是关于JavaScript Date对象的setFullYear()方法的完整攻略,包括两个示例说明。 JavaScript Date对象的setFullYear()方法 JavaScript Date对象的setFullYear()方法设置日期对象的年份部分。该方法接受一个整数,表示要设置的年份。如果该参数超出了JavaScript所能表示的范围,则自…

    JavaScript 2023年5月11日
    00
  • JavaScript操作文件_动力节点Java学院整理

    JavaScript操作文件攻略 在JavaScript中,我们可以使用File API来操作文件,包括读取、写入、删除等操作。本攻略将为您提供完整的JavaScript操作文件方案。 读取文件 我们可以使用FileReader对象来读取文件中的内容。以下是读取文件的示例代码: const fileInput = document.getElementByI…

    JavaScript 2023年5月27日
    00
  • JavaScript闭包 懂不懂由你反正我是懂了

    JavaScript闭包是一种非常重要的概念,它在JavaScript开发中有着广泛的应用。对于初学者,理解闭包通常是比较难的,但只要掌握了闭包的基本原理,它对于我们掌握JavaScript编程技能将会带来很大的帮助。 什么是JavaScript闭包? JavaScript闭包指的是访问定义在函数内部作用域里的变量的函数。通俗来说,是在函数中定义并返回另一个…

    JavaScript 2023年6月10日
    00
  • Javascript Date setUTCFullYear() 方法

    以下是关于JavaScript Date对象的setUTCFullYear()方法的完整攻略,包括两个示例说明。 JavaScript Date对象的setUTCFullYear()方法 JavaScript的setUTCFullYear()方法设置对象UTC年份部分。该方法接受一个整数,表示要设置的UTC年份。如果该参数超出了JavaScript所能表示的…

    JavaScript 2023年5月11日
    00
  • 解决拦截器对ajax请求的拦截实例详解

    解决拦截器对ajax请求的拦截实例详解 在使用拦截器的过程中,我们可能会发现拦截器会对ajax请求进行拦截,导致请求无法正常发送。解决这个问题,我们可以在拦截器中对ajax请求进行特殊处理,使其顺利通过。 首先,我们可以在请求前判断当前请求是否是ajax请求,如果是,则向请求头中添加一个特殊参数,如下所示: import axios from ‘axios’…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部