setTimeout(fn(),t)和setTimeout(" fn()",t)之间有什么区别?

时间:2015-07-16 07:40:39

标签: javascript

点击按钮,我试图设置超时以再次调用相同的功能。

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

两者之间有什么区别?



function f2 () {
  setTimeout(f2(), 100)
  // this runs `f2` immediately, i.e., `100` has no effect
  // after a while, an error occurs

  setTimeout("f2()", 100)  // works
}

<input type="button" onclick="f2()">
&#13;
&#13;
&#13;

4 个答案:

答案 0 :(得分:4)

从MDN,WindowTimers.setTimeout允许使用以下语法:

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

如果您传递setTimeout一个字符串,它将eval使用它。这既缓慢又危险,所以不要这样做。你只是在寻找麻烦。 而不是,将函数作为第一个参数传递。例如:

// 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)

这是一个更全面的例子。一定要看看你的控制台:

&#13;
&#13;
/*  ~~~ 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
&#13;
&#13;
&#13;

答案 1 :(得分:2)

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

当你调用这个setTimeout(fn(),t)时,fn()将首先执行,你在setTimeout()中传递的是fn()的结果(通过return关键字)。

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

你应该这样打电话:

  

的setTimeout(FN,t)的

答案 2 :(得分:1)

第一种形式立即运行f2,并在100 ms后尝试将f2的返回值作为函数运行。在你的情况下,这是未定义的。第二种形式基本上会破坏你在100毫秒后传递的字符串

答案 3 :(得分:1)

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

在这里寻找更多信息: JavaScript.setTimeout

相关问题