that = $(this)表示setTimeout闭包没有按预期工作
that = $(this) for a setTimeout closure not working as expected
我想在按钮mouseout
中使用setTimeout
,并参考setTimeout
中的$(this)
(按钮)。我使用that = $(this)
,然后在setTimeout
中使用that
,但它不像预期的那样工作。
如果你把鼠标悬停在每个链接上,它可以工作(1,2,3)。但如果你在100毫秒内快速完成,我就会得到所有3s(3,3,3)。
我的猜测是闭包不工作,that
var被覆盖,但我只是不知道为什么。
你能解释一下发生了什么吗?
$("nav a")
.mouseenter(function() {
//
})
.mouseout(function(event) {
that = $(this);
setTimeout(function(){
console.log( that.data('uid') );
}, 100);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<nav>
<ul>
<li><a href="" data-uid="1">One</a></li>
<li><a href="" data-uid="2">Two</a></li>
<li><a href="" data-uid="3">Three</a></li>
</ul>
</nav>
您应该将that
设置为本地变量(使用var
):
$("nav a")
.mouseenter(function() {
//
})
.mouseout(function(event) {
var that = $(this);
setTimeout(function(){
console.log( that.data('uid') );
}, 100);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<nav>
<ul>
<li><a href="" data-uid="1">One</a></li>
<li><a href="" data-uid="2">Two</a></li>
<li><a href="" data-uid="3">Three</a></li>
</ul>
</nav>
在您当前的代码中,that
是一个全局变量,并且对于每个mouseout
,您都将其重写为新元素。
您的变量被提升为没有var关键字的全局变量。您应该考虑使用严格模式来避免将来出现这种情况。
编辑:正如@Dekel在评论中指出的那样,严格模式实际上不会解决你的问题,但是当你试图声明一个没有var关键字的变量时,会出错。这是一个很好的实践,可以帮助避免这种意外的行为。
'use strict';
$("nav a")
.mouseenter(function() {
//
})
.mouseout(function(event) {
var that = $(this);
setTimeout(function(){
console.log( that.data('uid') );
}, 100);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<nav>
<ul>
<li><a href="" data-uid="1">One</a></li>
<li><a href="" data-uid="2">Two</a></li>
<li><a href="" data-uid="3">Three</a></li>
</ul>
</nav>
相关文章:
- 从js引擎的角度来看闭包和构造函数是如何工作的
- javascript中的闭包对我来说工作方式不同
- 在这种特殊情况下,闭包是如何工作的
- 节点 js 中的闭包未按预期工作
- 如何使这个简单的JavaScript闭包工作
- 这和javascript中的闭包(在纸上工作.js)
- Javascript闭包无法按预期工作
- 为什么这个javascript闭包没有像我希望的那样工作
- 为什么这个闭包示例工作不正确
- JavaScript自调用函数闭包不能正常工作
- 有人能解释一下这个javascript闭包是如何工作的吗?
- 不理解闭包函数是如何工作的
- 闭包是如何工作的
- 让Google闭包编译器自动工作,而不是手动修复IE8解析错误
- 闭包返回是如何工作的
- 实现与闭包编译器一起工作的JavaScript类
- 函数式编程——为什么这个javascript闭包不能工作?
- that = $(this)表示setTimeout闭包没有按预期工作
- 在这种情况下,JavaScript闭包是如何工作的
- 闭包的JavaScript工作