javascript - setTimeout(fn(), t) 和 setTimeout ("fn()", t) 有什么区别?

标签 javascript

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

我尝试了setTimeout(f2(), 100),但这没有按预期工作。它立即再次调用 f2,而不是在 100 毫秒后。但是,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()">

最佳答案

来自 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)

这是一个更全面的示例。请务必查看您的控制台:

/*  ~~~ 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

关于javascript - setTimeout(fn(), t) 和 setTimeout ("fn()", t) 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31448154/

相关文章:

javascript - 如何在 gulpfile.js 中使用 babel-polyfill

单击星星后 JavaScript 星星不发光?

javascript - 垂直滚动多个 div

javascript - 在 React 中使用变量渲染组件

javascript - AngularJS 提供者

javascript - MutationObserver 仅用于最后一个突变

javascript - Flask 后台运行函数时,如何给页面添加加载gif?

javascript - 在通用分析中获取 'Traffic Source'

javascript - 让文本颜色始终与背景图像颜色相反?

javascript - CouchDB 按链接文档属性排序