为什么setTimeout不能延迟函数执行?

10
function tryToDownload(url)
{

       oIFrm = document.getElementById('myIFrm');
       oIFrm.src = url;
      // alert(url);
      // url=escape(url);

      setTimeout(deletefile(url), 25000); 
}

以下是删除文件函数

function deletefile(url){

$.ajax({
    type:'post',
    url: "<%= addToDoDeleteDownloadFile %>",
    data:{filename:url},
    type : "GET",
    timeout : 20000,
    dataType : "text",
    success : function(data) {
        alert("success");

    }
    });
}

这是我的jQuery代码,我在最后调用一个函数,并希望它在25秒后执行,但不知何故它并没有将 deletefile(url) 函数延迟执行,而是立即执行了。那么问题应该是什么呢?


可能是Javascript setTimeout的重复问题。 - Fraser
1
@Fraser:在我看来,那并不是完全重复的。 - Matt
2个回答

19
在这行代码中,你调用了你的函数并将其结果传递给setTimeout()函数。
setTimeout(deletefile(url), 25000);

如果您想延迟执行,请添加一个包装函数:

setTimeout( function(){ deletefile(url); }, 25000);

编辑

@Petah 提出的另一种方案:

setTimeout(deletefile, 25000, url);

setTimeout()的所有参数都会在延迟后传递给函数执行。因此,在这种情况下,按顺序将引用、延迟和参数传递给该函数!

请注意,根据MDN的说法,在IE9之前的IE浏览器中,这种方式传递参数是不起作用的。


@Bhavik Kama:如果你有 foo(deletefile(url)),那么它会立即调用 deletefile 并将其返回值传递给 foo,是吗?所以这与 Sirko 所说的 setTimeout 完全相同。 - T.J. Crowder
@Petah,在Internet Explorer中向函数传递额外的参数不起作用。 - Vitalii Petrychuk
@VitaliyPetrychuk,该死。IE太蠢了。 - Petah

3

这是因为你正在调用函数,并在setTimeout调用中使用返回值。将其包装在匿名函数中,以便它由setTimeout调用:

function tryToDownload(url) {

    oIFrm = document.getElementById('myIFrm');
    oIFrm.src = url;
   // alert(url);
   // url=escape(url);

   setTimeout(function() { deletefile(url); }, 25000);

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接