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

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日

相关文章

  • JS基于正则表达式的替换操作(replace)用法示例

    JS基于正则表达式的替换操作(replace)是指通过正则表达式来查找目标字符串中的特定内容,并且将这些特定内容替换成指定的文本。replace方法基于正则表达式模式来查找替换目标字符串中符合要求的部分。replace方法是字符串的一种方法,它使用指定的模式匹配来搜索字符串,并使用一个替换字符串来替换匹配的子串,而不改变原始字符串。 replace基本用法 …

    JavaScript 2023年6月10日
    00
  • js删除所有的cookie的代码

    要删除所有的cookie,可以使用以下代码: // 获取所有的cookie var cookies = document.cookie.split(";"); // 遍历所有cookie,逐个删除 for (var i = 0; i < cookies.length; i++) { var cookie = cookies[i]; …

    JavaScript 2023年6月11日
    00
  • 微信小程序学习笔记之文件上传、下载操作图文详解

    微信小程序学习笔记之文件上传、下载操作图文详解 本文主要介绍了在微信小程序中进行文件上传和下载的操作,包括上传和下载的基本流程、代码实现的步骤以及示例演示等。 文件上传基本流程 文件上传的基本流程包括: 创建文件上传组件和触发上传事件。 选择要上传的文件。 获取上传文件的tempFilePath。 发送上传请求。 处理上传成功或上传失败的结果。 文件上传代码…

    JavaScript 2023年5月19日
    00
  • JS难点同步异步和作用域与闭包及原型和原型链详解

    JS难点同步异步和作用域与闭包及原型和原型链详解攻略 JavaScript在前端开发中非常重要,但其语言特性较为复杂,其中同步异步和作用域与闭包及原型和原型链都是前端开发人员需要掌握的难点。下面我们就来详细讲解这三个难点的知识点及应用。 同步异步 在JS中同步执行和异步执行是最常见的两种执行方式。同步执行即是代码按照写入顺序依次执行,每一行代码等待上一行代码…

    JavaScript 2023年6月10日
    00
  • Ajax入门学习教程(一)

    这里是Ajax入门学习教程(一)的详细攻略: 一、什么是Ajax Ajax(Asynchronous JavaScript and XML)指的是一种在Web应用中创建交互式的、快速动态的用户体验的技术。通过Ajax,你可以使用JavaScript向服务器异步发出请求,获取数据,然后将这些数据呈现在页面上。 二、Ajax实现步骤 实现Ajax主要有以下步骤:…

    JavaScript 2023年6月11日
    00
  • JavaScript统计网站访问次数的实现代码

    下面是详细讲解: JavaScript统计网站访问次数的实现代码 在网站开发中,常常需要统计网站的访问次数。本文将介绍一种通过JavaScript实现统计网站访问次数的方法。 方法一:使用localStorage 在本地存储中使用localStorage可以轻松地实现统计网站访问次数。代码如下: if (localStorage.pageviews) { l…

    JavaScript 2023年6月11日
    00
  • javascript匿名函数中的’return function()’作用

    当我们使用JavaScript编写应用程序时,匿名函数通常是一个非常有用的工具。匿名函数的返回值可以是另一个函数。在这个返回的函数中,可以访问外部函数的变量和参数,并保持对它们的引用。这种方式可以用来简化代码、提高可读性和保持代码的一致性。 例如,以下代码展示了一个使用匿名函数返回函数的示例: function createCalculator(x) { r…

    JavaScript 2023年5月27日
    00
  • javascript保留两位小数的实现方法你了解吗

    当需要在JavaScript中将一个数字保留两位小数时,通常有几种不同的方法可以实现。 方法一:使用toFixed()函数 .toFixed()函数是JavaScript中的内置函数,可以将数字转换为带有指定小数位数的字符串格式。 const num = 3.141592654; const roundedNum = num.toFixed(2); cons…

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