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日

相关文章

  • php cookie用户登录的详解及实例代码

    现在我来给您详细讲解“php cookie用户登录的详解及实例代码”的完整攻略。 概述 在网站开发中,登录是一个非常重要的功能。其中,保存用户登录状态的方式有多种,其中之一就是通过使用cookie来保存用户信息。本文将通过示例代码,详细讲解如何使用php cookie来实现用户登录。 实现步骤 步骤一:创建登录页面 首先,我们需要在HTML中创建一个登录页面…

    JavaScript 2023年6月11日
    00
  • JavaScript学习笔记之JS函数

    Javascript函数是一种重要的编程元素,用于封装可重用的功能。在本篇学习笔记中,我们将涵盖以下主题: 函数的定义和调用 函数参数的传递与默认值 函数返回值和作用域 1. 函数的定义和调用 JavaScript中函数可以通过函数声明或函数表达式来定义。函数声明使用关键字function定义,如下: function greet(name) { conso…

    JavaScript 2023年5月18日
    00
  • jquery教程ajax请求json数据示例

    下面是详细的攻略内容: jQuery教程:ajax请求json数据示例 简介 在现代网页开发中,经常需要从服务器动态地获取数据并实时展示到页面上。而Ajax技术则是实现这一目标的重要手段之一,jQuery作为一个广泛使用的Javascript库,封装了非常方便的Ajax请求操作。 本教程主要介绍如何使用jQuery实现Ajax请求,获取json格式的数据,并…

    JavaScript 2023年5月27日
    00
  • VBS教程:fso方法-CreateTextFile 方法

    VBS教程:fso方法-CreateTextFile 方法 简介 CreateTextFile 方法是 FileSystemObject 对象的一个方法,用于创建新文件并返回一个 TextStream 对象,该对象可用于向文件中写入数据。这个方法十分常见,使用频率高,应该是初学者必学的 VBS 语言的方法之一。 语法 CreateTextFile 方法的语法…

    JavaScript 2023年6月11日
    00
  • 解决React报错React Hook useEffect has a missing dependency

    下面是解决React报错React Hook useEffect has a missing dependency 的完整攻略: 一、报错原因 首先,我们需要了解报错原因。 在使用 React Hooks 的过程中,如果 useEffect 中使用了某些变量或函数,但没有将它们添加到依赖项数组中,就会出现 “React Hook useEffect has …

    JavaScript 2023年6月11日
    00
  • 从零开始用electron手撸一个截屏工具的示例代码

    下面是从零开始用Electron手撸一个截屏工具的示例代码的攻略: 创建一个Electron项目 首先,我们需要使用npm来创建一个空的Electron项目,可以使用以下命令: npm init -y npm install electron –save-dev 安装完成后,我们需要在package.json文件中添加一个start script: &qu…

    JavaScript 2023年6月11日
    00
  • JavaScript 学习 – 提高篇

    JavaScript 学习 – 提高篇 概述 在学习了基础的 JavaScript 后,接下来我们需要提高自己的 JavaScript 技能,为此我们需要学习一些高级特性和技巧。本篇文章将介绍 JavaScript 学习的提高篇内容,希望能够对你的 JavaScript 学习之路有所帮助。 高级特性的学习 闭包 闭包是 JavaScript 中一个非常重要的…

    JavaScript 2023年6月10日
    00
  • JavaScript HTML DOM 元素 (节点)新增,编辑,删除操作实例分析

    对于JavaScript HTML DOM 元素 (节点)新增,编辑,删除操作实例分析,我们可以按照以下步骤进行攻略。 1. 简介 在前端开发中,我们经常需要对HTML文档中的元素进行操作。HTML DOM (Document Object Model)提供了一系列操作HTML文档元素的方法,使得我们可以方便地实现对元素的新增、编辑和删除等操作。 2. 元素…

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