首页 > 其他分享 >js 闭包使用一例

js 闭包使用一例

时间:2023-11-27 15:33:21浏览次数:28  
标签:闭包 function startTimer sentence 一例 js sentences alert

有如下js:

function startTimer(sentence) {
    alert('start');
    sentence.longPressTimer = setTimeout(function() {
        alert(sentence);  //此处sentence为undefined
    }, 1000);
}

function endTimer(sentence) {
    alert('end');
    clearTimeout(sentence.longPressTimer);
}

var sentences = document.querySelectorAll('span.sentence');

alert(sentences.length);

for (var i = 0; i < sentences.length; i++) {
    sentences[i].addEventListener('touchstart', function(){ startTimer(sentences[i]); });
}

经过询问gpt3.5,成功解决了问题。回复如下:

根据你的代码,问题在于 sentences[i] 在回调函数中无法正确地获取到。这是因为回调函数是异步的,当它被调用时,循环已经结束了,此时 i 的值为 sentences.length,导致无法正确获取到 sentences[i]

为了解决这个问题,我们可以使用闭包来创建一个独立的作用域,以便在每次迭代中捕获正确的 sentences[i] 值。可以通过将 sentences[i] 作为参数传递给一个立即执行的函数表达式来实现闭包。修正后的代码如下所示:

function startTimer(sentence) {
    alert('start');
    sentence.longPressTimer = setTimeout(function() {
        alert(sentence);
    }, 1000);
}

function endTimer(sentence) {
    alert('end');
    clearTimeout(sentence.longPressTimer);
}

var sentences = document.querySelectorAll('span.sentence');

for (var i = 0; i < sentences.length; i++) {
    (function(index) {
        sentences[index].addEventListener('touchstart', function() {
            startTimer(sentences[index]);
        });
    })(i);
}

在这个修正后的代码中,我们使用立即执行的函数表达式 (function(index) { ... })(i) 来创建一个闭包。index 参数接收了循环的当前索引值 i,并在闭包内部被捕获。这样,在每次迭代中,都会创建一个新的独立作用域,并将正确的 sentences[i] 值传递给 startTimer() 函数。

标签:闭包,function,startTimer,sentence,一例,js,sentences,alert
From: https://www.cnblogs.com/nanfei/p/17859470.html

相关文章

  • 通俗易懂的js原型链
    原型链是js基础比较重要的一个环节;提到原型链有三个比较重要的概念:实例构造函数以及原型对象,其中三者的关系:构造函数new=》创建一个实例;构造函数prototype=》原型对象;同时原型对象constructor=》构造函数;实例__proto__=>原型对象;new运算符是如何工......
  • Java读取JSON文件
    读取json文件的结果利用fastjson进行转换为json对象或集合进行操作依赖的fastjson包<dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.17</version>......
  • Jayway JsonPath-提取JSON文档内容的Java DSL | 京东物流技术团队
    介绍JsonPath是一种能够提取部分JSON文档属性、对象、数组的语法,支持条件过滤、数学运算、字符串处理等功能。JsonPath与JSON文档就像XPath表达式与XML文档结合使用一样。由于JSON结构通常是匿名的,并不一定和XML一样具有“根成员对象”,因此JsonPath假定分配$给外层对象的抽......
  • 大模型训练过程中用到的 gpt_merge.txt和gpt_vocab.json是干什么用的?
    下面这边文章讲的非常清晰,原文链接:https://blog.csdn.net/ljp1919/article/details/113616226......
  • 配置 webpack.production.config.js
    配置webpack.production.config.js开发环境下,可以不用考虑系统的性能,更多考虑的是如何增加开发效率。而发布系统时,就需要考虑发布之后的系统的性能,包括加载速度、缓存等。下面介绍发布用配置代码和开发用的不一样的地方。发布到./build文件夹中path:__dirname+"/build",vendo......
  • JSON
    json格式{"name":"John","age":30,"city":"NewYork"}json数组["Google","Runoob","Taobao"]{"name":"网站","num":3,"sites":[&qu......
  • ThreeJS导入失败
    title:ThreeJS导入失败banner_img:https://proxy.thisis.plus/aadc0c1c0eb1c7f5e57ab3b42256cb0.jpgdate:2023-1-1310:00:00categories:-踩坑tags:-ThreeJS问题描述-index.html-src.js-node_modules-three-...在src.js中用如下方式导入ThreeJSimport*......
  • ThreeJS实现屏幕坐标转3d坐标
    title:ThreeJS实现屏幕坐标转3d坐标banner_img:https://drive.studyinglover.com/api/raw/?path=/photos/blog/background/e4127f10a90d5f6fd4f77b0225a19878.jpgdate:2023-2-420:30:00categories:-工具tags:-ThreeJSThreeJS实现屏幕坐标转3d坐标本文使用chatGPT辅......
  • js摄像头拍照、摄像
    备份留着万一用到,转自:https://cloud.tencent.com/developer/article/1357730?from=15425<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE......
  • 【Python爬虫】第10篇:js逆向解析和Mongodb数据库。md集合文档(已分享,附代码)
    本文主要学习一下关于爬虫的相关前置知识和一些理论性的知识,通过本文我们能够知道什么是爬虫,都有那些分类,爬虫能干什么等,同时还会站在爬虫的角度复习一下http协议。全套笔记和代码自取地址:请移步这里感兴趣的小伙伴可以自取哦,欢迎大家点赞转发~共8章,37子模块JS的解析......