问题描述
单击按钮时,我试图设置一个超时以再次调用同一函数。
我尝试了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()">
1楼
从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
2楼
setTimeout()的第一个参数应该是一个函数(或字符串形式的代码-不建议)。
当您调用此setTimeout(fn(),t)时,将首先执行fn(),而您传入??setTimeout()的内容是fn()的结果(通过return关键字)。
所以fn()不是函数,而是函数的结果。 一个函数必须是fn 。
您应该这样打电话:
setTimeout(fn,t)
3楼
第一种形式立即运行f2,并在100毫秒后尝试运行f2的返回值作为函数。 在您的情况下,这是不确定的。 第二种形式实质上是评估您在100毫秒后传递的字符串
4楼
您要传递对方法而不是方法的引用。 foo()是一个方法,foo是一个引用。 “ foo”和“ foo()”的工作原理相同。
在此处查找更多信息: