Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript setTimeout(fn(),t)和setTimeout(fn(),t)之间有什么区别?_Javascript - Fatal编程技术网

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)


在第一次调用中删除括号。