Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么setInterval不能在我的jQuery插件中工作?_Jquery_Jquery Plugins_Setinterval - Fatal编程技术网

为什么setInterval不能在我的jQuery插件中工作?

为什么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

此代码为我提供console.log,但不会每500毫秒重复一次。我只为“I”和“_images.length”获取了一次console.log。在那之后就不会再重复了

编辑:我删除了$.proxy位,它仍然没有重复

(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);
};