首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

setTimeout闭包未按预期工作时,that = $(this)

setTimeout闭包未按预期工作时,that = $(this)是一种常见的解决方案。在JavaScript中,setTimeout函数用于在指定的时间间隔后执行一段代码。然而,由于JavaScript的事件循环机制,setTimeout函数中的回调函数可能会在闭包中执行,导致this的指向发生变化。

为了解决这个问题,可以使用that = $(this)的方式来保存当前的this指向。这样,在闭包中就可以通过that来访问到正确的this对象。

具体来说,$(this)是jQuery库中的一个方法,用于将DOM元素包装成一个jQuery对象。通过使用$(this),可以确保that变量引用的是当前的DOM元素。

setTimeout闭包未按预期工作时,可以按照以下步骤进行修复:

  1. 在需要使用setTimeout的地方,先将this保存到一个变量that中,即that = $(this)。
  2. 在setTimeout的回调函数中,使用that来访问正确的this对象。

这样做的好处是可以避免this指向发生变化,确保在闭包中能够正确地访问到需要的对象。

推荐的腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

同步、异步、回调执行顺序之经典setTimeout分析

你打电话去订酒店,电话另一边的工作人员需要查下他们的管理系统才能告诉你有没有房间。...这时候你有两种选择:一种是不挂电话一直等待,直到工作人员查到为止(可能几分钟也可能几个小时,取决于他们的办事效率),这就是同步的。...(上图转引自Philip Roberts的演讲《Help, I'm stuck in an event-loop》))  简单的说,如果我们指定过回调函数,那么当事件发生就会进入事件队列,等待主线程的...当然也有同步回调),所以也就并不难理解,回调和异步之间其实并没有直接的联系,回调只是异步的一种实现方式,  通过这样的event loop我们其实可以分析出三者的执行顺序,即 同步 > 异步 > 回调 经典...7 8 console.log( i ); 我们都知道es5中变量作用域是函数,而es6却可以使用let声明一个具有块级作用域的i,在这里也就是for循环体; 在这里let本质上就是形成了一个

1.3K101
  • 图例详解那道setTimeout与循环的经典面试题

    Question 题目描述如下: Answer 在最初学习setTimeout的时候,我们很容易知道setTimeout有两个参数,第一个参数为一个函数,我们通过该函数定义将要执行的操作。...OK,关于setTimeout就暂时先介绍到这里,我们回过头来看看那个循环的思考题。...而我们想要让输出结果依次执行,我们就必须借助的特性,每次循环,将i值保存在一个中,当setTimeout中定义的操作执行时,则访问对应保存的i值即可。...而我们知道在函数中判定的准则,即执行时是否在内部定义的函数中访问了上层作用域的变量。因此我们需要包裹一层自执行函数为的形成提供条件。...因此,我们只需要2个操作就可以完成题目需求,一是使用自执行函数提供条件,二是传入i值并保存在中。 当然,也可以在setTimeout的第一个参数处利用

    20220

    使用 React Hooks 需要注意过时的!

    Hooks 严重依赖于 JS 。这就是为什么 Hooks 如此具有表现力和简单,但是有时很棘手。 使用 Hooks 可能遇到的一个问题就是过时的,这可能很难解决。...即使 value 变量在调用increment()被增加多次,message变量也不会更新,并且总是保持一个过时的值 "Current value is 0"。 过时的捕获具有过时值的变量。...在这里,log()捕获到count变量为0。 之后,即使在单击Increase按钮count增加,计时器函数每2秒调用一次的log(),使用count的值仍然是0。...计数器仅更新为1,而不是预期的2。 每次单击setTimeout(delay, 1000)将在1秒后执行delay()。delay()此时捕获到的 count 为 0。...4.总结 当捕获过时的变量,就会发生过时的问题。 解决过时的有效方法是正确设置React钩子的依赖项。或者,在失效状态的情况下,使用函数方式更新状态。 ~完,我是小智,我要去刷碗了。

    1.9K30

    + 局部作用域 === 如鱼得水

    《你不知道的JavaScript》第一部分作用域和第4篇。 在掌握作用域的前提下,才能真正理解和识别。...:当函数可以记住并访问所在的词法作用域,就产生了,即使函数是在当前词法作用域之外执行。...由于setTimeout是异步的,所以每次for循环js都会挂起setTimeout这个异步任务,等到for循环这个同步任务执行完毕,系统才会执行异步的任务队列,即执行setTimeout的回调函数...想到块作用域,ES6中的let关键字不是可以主动生成块作用域的么,把上例改一下,可以更简便的实现预期设想: for(let i=1; i<=5; i++){ setTimeout(function...块作用域 + ,简直不要太如鱼得水。 的作用强大,还可以用来写模块。

    60230

    当面试官问你,他究竟想听到些什么?

    “请你讲一下”——这道题几乎是前端面试必问的问题,今天我试着总结一下如何优雅的回答这道题 是什么? 是有权限访问其他函数作用域内的变量的一个函数。...解决了什么? 请放心,就凭上面那段话,面试官是不会善摆干休的。他一定会继续追问,一般来说会问——解决了什么问题。...我的回答会是下面的样子: 随处可见,一个Ajax请求的成功回调,一个事件绑定的回调方法,一个setTimeout的延时回调,或者一个函数内部返回另一个匿名函数,这些都是。...有哪些 原理比较深奥:要想完全掌握,一定要清楚函数作用域、内存回收机制、作用域继承等,然而是随处可见的,很可能开发者在不经意间就写出了一个,理解不够深入的话很可能造成运行结果与预期不符。... 是JavaScript这门语言中非常重要但又难以掌握的概念。

    1K50

    《你不知道的JavaScript》:与局部作用域

    《你不知道的JavaScript》第一部分作用域和第4篇。 在掌握作用域的前提下,才能真正理解和识别。...:当函数可以记住并访问所在的词法作用域,就产生了,即使函数是在当前词法作用域之外执行。...由于setTimeout是异步的,所以每次for循环js都会挂起setTimeout这个异步任务,等到for循环这个同步任务执行完毕,系统才会执行异步的任务队列,即执行setTimeout的回调函数...想到块作用域,ES6中的let关键字不是可以主动生成块作用域的么,把上例改一下,可以更简便的实现预期设想: for(let i=1; i<=5; i++){ setTimeout(function...块作用域 + ,简直不要太如鱼得水。 的作用强大,还可以用来写模块。

    52420

    js就那么回事

    今天了解了一下js这块的内容,还是有点诡异的,将实践结果记录一下,看完只后,我敢说,就那么回事,所谓的,其实就是客户端开发中,其实就是叫做内存泄漏,就是不当引用导致对象没法得到释放,哈哈,玩笑开得有点过了...(i) }, i * 1000) })() } 使用一个IIFE将其包裹起来,那么实际的执行结果将会符合我们的预期吗?...没错,同样的道理,并不符合我们的预期。...,那么为什么,我们分析setTimeout所处的作用域中,IIFE每次执行,相当于甩出了一个,每个j都是独立私有的,不在是外面那个i(等同于全局变量)。因此,执行结果符合我们的预期。...) }, j * 1000) } image.png 仅仅只是换了一个let,就做到了我们的想要的预期结果,那么这是为什么呢?

    663121

    深入理解JavaScript之什么是

    什么是 当函数可以记住并访问所在的词法作用域,就产生了,即使函数是在当前词法作用域之外执行的。...bar() 依然持有对该作用域的引用,这个引用就叫做。这个函数在定义的词法作用域以外的地方被调用。使得函数可以继续访问定义的词法作用域。...我们的预期是每个迭代在运行时都会给自己 "捕获" 一个 i 的副本。...}, j * 1000); })(i) } 代码改成上面这样,就可以按照我们期望的方式进行工作了。...内部函数在搜索这两个变量,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数的这两个变量。 不过把外部作用域中的 this对象保存在一个能够访问到的变量里,就可以让访问该对象了。

    84430

    JavaScript和匿名函数的关系详解

    前面讲了一篇在for加setTimeout输出内容,我们用到了一个,但同时也可以说是匿名函数,到底匿名函数和有没有关系呢?... js是指有权访问另一个函数作用域中的变量的函数,个人认为js最大的用处就是防止对全局作用域的污染。...更多介绍:浅谈JavaScript中的 我们可以分离出上面的第一个立即执行函数 function box(i){ setTimeout(function(){ console.log...在这种情况下,包机制通常是使特定代码段按预期工作的重要因素,而使用匿名函数而不是命名函数恰好是编码它的便捷方式。...一开始我以为匿名函数跟有关系,那是因为恰好这个定时器使用了和匿名函数,让我们误认为两者之间有关系,其实还有很多种方法可以解决这个问题,比如我们之前说到的setTimeout的第三个参数,同样可以得到跟使用立即执行函数同样的效果

    59030

    JavaScript之作用域和

    编译阶段中的一部分工作就是找到所有的声明,并用合适的作用域将它们关联起来; 因此包括变量和函数在内的所有声明都会在任何代码被执行前首先被处理; 当看到 var a = 2; ,可能会认为这是一个声明...二、作用域 (1)、理解 当函数可以记住并访问所在的词法作用域,就产生了,即使函数是在当前词法作用域之外执行。...循环和: for (var i=1; i<=5; i++) { setTimeout( function timer() { console.log( i ); },...i*1000 ); } 正常情况下,我们对这段代码行为的预期是分别输出数字 1~5,每秒一次,每次一个。...(4)、使用的注意点 由于会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用,否则会造成网页的性能问题,在IE中可能导致内存泄露。

    70510

    彻底理解js中的

    是js的一个难点也是它的一个特色,是我们必须掌握的js高级特性,那么什么是呢?它又有什么用呢?...就是用来解决这一需求的,的本质就是在一个函数内部创建另一个函数。...我们首先知道有3个特性: ①函数嵌套函数 ②函数内部可以引用函数外部的参数和变量 ③参数和变量不会被垃圾回收机制回收 本文我们以两种的主要形式来学习 ①函数作为返回值 在这段代码中,a()中的返回值是一个匿名函数...原来由于js是单线程的,所以在执行for循环的时候定时器setTimeout被安排到任务队列中排队等待执行,而在等待过程中for循环就已经在执行,等到setTimeout可以执行的时候,for循环已经结束...(ps:如果把for循环里面的var变成let,也能实现预期结果) 引入来保存变量i,将setTimeout放入立即执行函数中,将for循环中的循环值i作为参数传递,100毫秒后同时打印出1 2

    72610

    js中的

    是js的一个难点也是它的一个特色,是我们必须掌握的js高级特性,那么什么是呢?它又有什么用呢?...就是用来解决这一需求的,的本质就是在一个函数内部创建另一个函数。...我们首先知道有3个特性: ①函数嵌套函数 ②函数内部可以引用函数外部的参数和变量 ③参数和变量不会被垃圾回收机制回收 本文我们以两种的主要形式来学习 在这段代码中,a()中的返回值是一个匿名函数...原来由于js是单线程的,所以在执行for循环的时候定时器setTimeout被安排到任务队列中排队等待执行,而在等待过程中for循环就已经在执行,等到setTimeout可以执行的时候,for循环已经结束...(ps:如果把for循环里面的var变成let,也能实现预期结果) 引入来保存变量i,将setTimeout放入立即执行函数中,将for循环中的循环值i作为参数传递,100毫秒后同时打印出1 2

    3.2K30

    循环中的异步&&循环中的

    (() => { console.log(index); }, 1000*index); } } foo() 方式四,通过实现 开始讨论方式四之前我推荐先阅读一遍我之前写过一篇文章...,5个index变量,分别是0,1,2,3,4,相互独立,互不影响,输出了预期的结果 如果说每次循环都会生成一个独立的作用域用来保存index,问题就会得到解决,所以,我们通过来实现 const...中的匿名回调函数中引用了函数fun中的局部变量j,所以当fun执行完毕后,变量j不会被释放,这就形成了 当然我们可以对此进行一下优化 const array = [1, 2, 3, 4, 5...也可以使用,模拟实现let 在实际开发过程中,循环调用异步函数,比demo要复杂,可能还会出现if和else判断等逻辑,具体的我们下次再续 参考 通过for循环每隔两秒按顺序打印出arr中的数字 setTimeOut...和 《你不知道的JavaScript》上卷

    1.6K20

    React Hook 和 Vue Hook

    例如,当使用多个 mixin 读取组件的模板,可能很难确定从哪个 mixin 注入了特定的属性。 命名空间冲突。...Mixins 可能会在属性和方法名称上发生冲突,而 HOC 可能会在预期的 prop 名称上发生冲突。 性能问题,HOC 和无渲染组件需要额外的有状态组件实例,这会降低性能。...三、React Hooks 中的问题 Hooks 严重依赖于 JS ,但是有时很棘手,当咱们使用一个有多种副作用和状态管理的 React 组件,可能会遇到的一个问题是过时的。...使用新的 解决过时的第一种方法是找到捕获最新变量的。 找到捕获了最新 message 变量的,就是从最后一次调用 inc() 返回的。...React Hook解决过时问题的方法: 解决过时的一个有效方法是正确设置 React Hook 的依赖项。 对于过时的状态,使用函数方式更新状态。

    2.1K20

    JS中的for循环——你可能不知道的点。

    问题1解决与相关讲解 结果 预期结果 0 2 1 4 2 6 3 8 4 10 运行后的结果 5 undefined 5 undefined 5 undefined 5 undefined...等到了setTimeOut预定的时间后就会执行在for遍历过程中声明的5个setTimeout。所以最终运行后会出现上面的结果,与预期结果不符。...,立即执行函数 想要得到预期的结果,第一种办法是使用,在函数内部形成了局部作用域,每循环一次,形成一个自己的局部作用域,不受外部变量变化的影响。...experience_time:{ '$lte':moment().subtract(15-item.day,'day').endOf('day') ,//获取四天前都00...分秒 '$gte':moment().subtract(15-item.day,'day').startOf('day') ,//获取四天前都00分秒

    2.4K11

    使用React Hooks 要避免的5个错误!

    3.不要创建过时的 React Hook 很大程序上依赖于的概念。依赖是它们如此富有表现力的原因。 JavaScript 中的是从其词法作用域捕获变量的函数。...当使用 Hook 接受回调作为参数(如useEffect(callback, deps), useCallback(callback, deps)),你可能会创建一个过时的,一个捕获了过时的状态或变量的...我们来看看一个使用useEffect(callback, deps) 而忘记正确设置依赖关系创建的过时的例子。...log 函数是一个过时的,因为它捕获了一个过时的状态变量count。...正如预期的那样,状态变量count每秒钟都会增加。 在进行递增操作,单击umount 按钮,卸载组件。React会在控制台中警告更新卸载组件的状态。 ?

    4.2K30

    JS中的for循环——你可能不知道的点。

    问题1解决与相关讲解 结果 预期结果 0 2 1 4 2 6 3 8 4 10 运行后的结果 5 undefined 5 undefined 5 undefined 5 undefined...等到了setTimeOut预定的时间后就会执行在for遍历过程中声明的5个setTimeout。所以最终运行后会出现上面的结果,与预期结果不符。...,立即执行函数 想要得到预期的结果,第一种办法是使用,在函数内部形成了局部作用域,每循环一次,形成一个自己的局部作用域,不受外部变量变化的影响。...experience_time:{ '$lte':moment().subtract(15-item.day,'day').endOf('day') ,//获取四天前都00...分秒 '$gte':moment().subtract(15-item.day,'day').startOf('day') ,//获取四天前都00分秒

    1.4K20
    领券