如何访问“;这个“;在封闭物内
How to access "this" inside a closure?
我是JavaScript和jQuery的新手,我在一些代码上遇到了麻烦。
HTML:
<div class="toggle" style="display: block; width: 200px; height: 200px; background-color: red;">test</div>
JavaScript:
jQuery(document).ready(
function()
{
jQuery(".toggle").on("click", function() {
console.log("let the toggling begin!");
jQuery(this).slideToggle(600, function(){ // slide up
setTimeout(function(){ // wait 4 sec, then slide back down
jQuery(this).slideToggle(600)
}, 4000);
});
});
}
);
所以这个想法是,你点击div,它向上滑动,4秒后又向下滑动。它不起作用。
JSFIDDLE:http://jsfiddle.net/zEqN9/2/
但是,如果我将每个闭包中的this
更改为".toggle"
,那么它确实有效。
JSFIDDLE:http://jsfiddle.net/YZxMb/
很明显,问题在于我对this
的使用。
我尝试将this
作为参数传递到两个闭包函数中的每一个函数中,但这会产生错误Unexpected token this
。
如何从内部函数访问this
变量?
在slideToggle函数中创建对this
的引用。
jQuery(document).ready(
function()
{
jQuery(".toggle").on("click", function() {
console.log("let the toggling begin!");
jQuery(this).slideToggle(600, function(){ // slide up
var self = this; // <-- notice this
setTimeout(function(){ // wait 4 sec, then slide back down
jQuery(self).slideToggle(600)
}, 4000);
});
});
}
);
使用bind
为期望断章取义调用的函数指定this
。
var foo = {
bar: function () {
setTimeout(function () { // though in a setTimeout
console.log(this);
}.bind(this), 0); // binding to `this` here means
}
};
foo.bar(); // invoking it still has `this` of `foo`
var yourThing = jQuery(this);
yourThing.slideToggle(600, function(){ // slide up
setTimeout(function(){ // wait 4 sec, then slide back down
yourThing.slideToggle(600)
}, 4000);
});
只需在代码中添加这一行即可理解原因:
setTimeout(function(){ // wait 4 sec, then slide back down
console.log(jQuery(this)); //this one
jQuery(this).slideToggle(600)
}, 4000);
打开控制台。您将看到,在setTimeout
函数中,$(this)指的是窗口对象。
您需要创建一个对此的引用,因此当运行与setTimeout关联的函数时,您可以传递此引用。
jQuery(document).ready(
function()
{
jQuery(".toggle").on("click", function() {
console.log("let the toggling begin!");
var that = this; // <--- reference to this
jQuery(this).slideToggle(600, function(){ // slide up
setTimeout(function(){ // wait 4 sec, then slide back down
jQuery(that).slideToggle(600)
}, 4000);
});
});
}
);
原因是对于jQuery事件,函数的上下文被显式设置,以便this
引用目标元素-这是由jQuery为您完成的。但是,setTimeout
的匿名函数没有为您设置该上下文——它获得默认的全局上下文,因此this
引用该窗口。
您需要做的是获取对点击事件上下文的引用,然后在超时时使用该引用:
jQuery(function () {
jQuery(".toggle").on("click", function () {
var $this = $(this);
$this.slideToggle(600, function () { // slide up
setTimeout(function () { // wait 4 sec, then slide back down
$this.slideToggle(600);
}, 4000);
});
});
});
然而,正如评论中所指出的,这可以写成:
jQuery(function () {
jQuery(".toggle").click(function () {
jQuery(this).slideToggle(600).delay(4000).slideToggle(600);
});
});
相关文章:
- 为什么在这个网站上不能通过JS访问元素
- 我如何才能访问修改这个价格函数在马根托
- 为什么我不能在javascript中访问这个变量
- 这个_Meteor js中的Iron控制器无法访问id.如何获取id
- 为什么可以't我通过ID访问这个动态加载的DOM元素(没有iframe)
- 访问父“;这个“;变量,来自继承类
- 如何访问这个jQuery变量
- 如何访问jQuery.each's”;这个“;在TypeScript中
- 如何通过jQuery/JavaScript访问这个JSON结构,而不使用for循环
- 这个最终数字从何而来
- jQuery - 如何使这个javascript函数全局化,以便其他函数可以访问它
- 在这个 JavaScript 代码中,为什么有些函数可以访问内部变量,而另一些则不能
- 为什么这个 javascript 函数不能访问同一类中的变量
- 为什么这个图像访问加载错误在承诺脚本小提琴上
- 如何访问“;这个“;在封闭物内
- 如何在不使用这个创建可公开访问的Javascript变量的情况下生成原型类函数
- 如何访问这个Javascript数组(JSON对象?)
- "这个“;在用于效果的嵌入式函数中不可访问
- 访问指令's将范围与“;这个“;使用controllerAs语法
- 访问“;这个“;在javascript类的子对象内