当前位置: 代码迷 >> JavaScript >> setTimeout(fn(),t)和setTimeout(“ fn()”,t)有什么区别?
  详细解决方案

setTimeout(fn(),t)和setTimeout(“ fn()”,t)有什么区别?

热度:89   发布时间:2023-06-07 16:41:50.0

单击按钮时,我试图设置一个超时以再次调用同一函数。

我尝试了setTimeout(f2(), 100) ,但这没有按预期工作。 它立即再次调用f2 ,而不是在100ms之后。 但是, setTimeout("f2()", 100)有效。

两者有什么区别?

 function f2 () { setTimeout(f2(), 100) // this runs `f2` immediately, ie, `100` has no effect // after a while, an error occurs setTimeout("f2()", 100) // works } 
 <input type="button" onclick="f2()"> 

从MDN, 允许以下语法:

var timeoutID = window.setTimeout(func, [delay, param1, param2, ...]);
var timeoutID = window.setTimeout(code, [delay]);

如果您通过字符串,它会审视你们的。 这既缓慢又危险,请要这样做。 您只是在自找麻烦。 而是将函数作为第一个参数传递。 例如:

// you can pass an anonymous function
setTimeout(function () { /* do something */ }, 420)

// or, a named function
// note how you don't pass an executed function, e.g., `someAwesomeFunc()`,
// UNLESS `someAwesomeFunc` returns a function
setTimeout(someAwesomeFunc, 9000)

这是一个更全面的示例。 确保查看您的控制台:

 /* ~~~ EXAMPLE #0 ~~~ */ // the passed string is evaluated // DO NOTE DO THIS…EVER! setTimeout('console.log("hi", new Date())', 1000) /* ~~~ EXAMPLE #1 ~~~ */ // an anonymous function is passed // everything is bueno setTimeout(function () { console.log('hi! #2', new Date()) }, 2000) /* ~~~ EXAMPLE #2 ~~~ */ // note how `getHi` *returns* an anonymous function // that means `typeof getHi(420) === 'function'` var getHi = function (num) { return function () { console.log('hi! #' + num, new Date()) } } // as previously stated `getHi(420)` returns a function // so this works in the same manner as example #2 setTimeout(getHi(420), 4200) /* ~~~ EXAMPLE #3 ~~~ */ var returnHi = function () { return 'hi!' } // `returnHi` returns neither function nor code, so a syntax error is thrown setTimeout(returnHi(), 5000) // <-- doesn't work 

setTimeout()的第一个参数应该是一个函数(或字符串形式的代码-不建议)。

当您调用此setTimeout(fn(),t)时,将首先执行fn(),而您传入??setTimeout()的内容是fn()的结果(通过return关键字)。

所以fn()不是函数,而是函数的结果。 一个函数必须是fn

您应该这样打电话:

setTimeout(fn,t)

第一种形式立即运行f2,并在100毫秒后尝试运行f2的返回值作为函数。 在您的情况下,这是不确定的。 第二种形式实质上是评估您在100毫秒后传递的字符串

您要传递对方法而不是方法的引用。 foo()是一个方法,foo是一个引用。 “ foo”和“ foo()”的工作原理相同。

在此处查找更多信息: