Javascript setTimeout(fn(),t)和setTimeout(fn(),t)之间有什么区别?
在单击按钮时,我试图设置一个超时来再次调用相同的函数 我尝试了Javascript setTimeout(fn(),t)和setTimeout(fn(),t)之间有什么区别?,javascript,Javascript,在单击按钮时,我试图设置一个超时来再次调用相同的函数 我尝试了setTimeout(f2(),100),但没有按预期工作。它立即再次调用f2,而不是在100毫秒之后。然而,setTimeout(“f2()”,100)起作用了 这两者有什么区别 函数f2(){ setTimeout(f2(),100) //它立即运行'f2',即'100'无效 //过了一会儿,出现了一个错误 setTimeout(“f2()”,100)//有效 } 第一个表单立即运行f2,并在100毫秒后尝试将f2的返回值作为函
setTimeout(f2(),100)
,但没有按预期工作。它立即再次调用f2
,而不是在100毫秒之后。然而,setTimeout(“f2()”,100)
起作用了
这两者有什么区别
函数f2(){
setTimeout(f2(),100)
//它立即运行'f2',即'100'无效
//过了一会儿,出现了一个错误
setTimeout(“f2()”,100)//有效
}
第一个表单立即运行f2,并在100毫秒后尝试将f2的返回值作为函数运行。在你的情况下,这是未定义的。第二种形式实质上是从MDN中计算100毫秒后传递的字符串,允许使用以下语法:
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)
这里有一个更全面的例子。确保查看您的控制台:
/*~~示例#0~~*/
//将计算传递的字符串
//一定要这样做…永远!
setTimeout('console.log(“hi”,new Date())',1000)
/*~~~示例#1~~~*/
//传递一个匿名函数
//一切都很好
setTimeout(函数(){
console.log('hi!#2',new Date())
}, 2000)
/*~~~示例#2~~~*/
//注意`getHi`*如何返回*一个匿名函数
//这意味着'typeofgethi(420)='function'`
var getHi=函数(num){
返回函数(){
console.log('hi!#'+num,new Date())
}
}
//如前所述,getHi(420)`返回一个函数
//因此,其工作方式与示例2相同
设置超时(getHi(420),4200)
/*~~~示例#3~~~*/
var returnHi=函数(){return'hi!'
//`returnHi`既不返回函数也不返回代码,因此引发语法错误
setTimeout(returnHi(),5000)/您希望传递对方法的引用,而不是方法。foo()是一个方法,foo是一个引用。“foo”和“foo()”的工作原理相同
请在此处查看更多信息:
setTimeout()的第一个参数应该是函数(或作为字符串的代码-不建议使用)
调用此setTimeout(fn(),t)时,将首先执行fn(),传入setTimeout()的是fn()的结果(按return关键字)
所以fn()不是函数,而是函数的结果。函数必须是fn
你应该这样称呼:
设置超时(fn,t)
在第一次调用中删除括号。