setTimeout(fn(), t)和setTimeout("fn()", t)有什么区别?
What is the difference between setTimeout(fn(), t) and setTimeout("fn()", t)?
点击按钮,我正在尝试设置超时以再次调用相同的函数。
我尝试了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()">
从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
setTimeout()的第一个参数应该是一个函数(或字符串形式的代码-不建议)。
当你调用这个setTimeout(fn(),t)时,fn()将首先执行,你在setTimeout()中传递的是fn()的结果(通过返回关键字)。
所以fn()不是函数,而是函数的结果。函数必须fn
你应该这样调用:
setTimeout (fn, t)
第一种形式立即运行f2,并在100毫秒后尝试将f2的返回值作为函数运行。在你的例子中,这是未定义的。第二种形式是计算100毫秒后传递的字符串
你想传递一个方法的引用,而不是一个方法。Foo()是一个方法,Foo是一个引用。"foo"answers"foo()"的工作原理相同。
在这里查看更多信息:JavaScript.setTimeout
相关文章:
- setInteval vs setTimeout
- 铬:“;未捕获的语法错误:意外的标记:"
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- 使用“+="操作人员
- //而不是在src=“”上使用http://"属性
- "未捕获的语法错误:意外的标记}"
- 可以<脚本类型=“;text/javascript”>window.location=“/"</
- "实例范围”;TypeScript类的getter/setter
- Javascript复选框函数:;缺少:在属性id之后"
- setTimeout可以与闭包内的函数一起使用吗
- "“;变量未引用正确的对象
- Javascript setTimeout for an array
- "日期“;AJAX请求返回的类型值未定义
- 刷新后,setTimeout将工作或不工作
- 得到"TypeError:无法读取属性'filename'未定义的“;调用“npm start
- "函数未定义”;当使用setTimeout时
- 带有setTimeout的JS Timer得到一个";未捕获的SyntaxError:意外的令牌("