为什么setInterval不能在我的jQuery插件中工作?
此代码为我提供console.log,但不会每500毫秒重复一次。我只为“I”和“_images.length”获取了一次console.log。在那之后就不会再重复了 编辑:我删除了$.proxy位,它仍然没有重复为什么setInterval不能在我的jQuery插件中工作?,jquery,jquery-plugins,setinterval,Jquery,Jquery Plugins,Setinterval,此代码为我提供console.log,但不会每500毫秒重复一次。我只为“I”和“_images.length”获取了一次console.log。在那之后就不会再重复了 编辑:我删除了$.proxy位,它仍然没有重复 (function ( $ ) { $.fn.gallery = function() { var images = $(this); return setInterval($.proxy(changeImage(images)), 500); }; var i
(function ( $ ) {
$.fn.gallery = function() {
var images = $(this);
return setInterval($.proxy(changeImage(images)), 500);
};
var i = 0;
var changeImage = function(images){
i++;
console.log(i);
var _images = images;
console.log(_images.length);
}
}( jQuery ));
$(function(){
$('.home-gallery').gallery();
});
你不能通过那样的考试。您必须将其包装在匿名函数中 您应该这样做:
$.fn.gallery = function() {
var images = $(this);
return setInterval(changeImage(images), 500);
};
您不需要注释中建议的
$.proxy
。您没有正确使用$.proxy,您甚至不需要它。简单地说,做:
setInterval(function () {
changeImage(images);
}, 500);
两个答案都是正确的,但都不完整。
setInterval()
的第一个参数必须是函数或字符串,因此将其包装在匿名函数中是一个良好的开端
接下来,由于setInterval()
在计时器后再次触发,因此作用域将更改,变量“images”将不再存在
您需要执行以下操作:
return setInterval(function(){
changeImage(images)
}, 500);
$.proxy(changeImage(images))
错误关闭,但不完全正确。这里不需要$.proxy
<代码>$。代理
类似于函数。绑定
,它返回一个函数。它的用法类似于var func=$.proxy(changeImage,null,images)
,然后您可以调用func()
,但此处不需要它,因为changeImage
不使用此`.@user1426594:您编辑的帖子仍然不正确。检查答案。注意我是如何传递函数的。您正在调用changeImage
并将其返回值传递给setInterval
。这修复了它,但我不确定原因。我总是通过简单地传递一个函数来执行setInterval。我不知道为什么它只运行了一次,你能解释一下吗?@user1426594:因为当你执行setInterval(changeImage(images),500)
时,你没有传递函数。您正在调用它并传递其返回值。如果您确实返回setInterval(changeImage,500)
,则您将传递函数,但当调用该函数时,不会传递图像。这就是为什么需要向它传递一个匿名函数,该函数使用正确的参数调用changeImage
。这似乎不是真的。log(images.length)在您右侧的每个callOh yep上输出正确的号码。我的错误。。。我的借口是这里太晚了哈!不,那不是真的<代码>图像
将保留在内存中,因为仍有对它的引用。此外,您正在错误地使用$.proxy
。只有在循环中调用setTimeout
并尝试访问(不断变化的)循环变量时,您才试图解决此问题。这不是问题。是的,你的权利,我刚刚放了个脑屁。这里的常规做法是什么?我是否删除我的回复?
$.fn.gallery = function() {
var images = $(this);
return setInterval((function(images){
return function() {
$.proxy(changeImage(images));
};
})(images), 500);
};