在JavaScript中,setTimeout
函数需要将代码括在函数中。
无效超时的示例:
window.setTimeout(console.log('PING'),3000)
function ping(){console.log('PING')};window.setTimeout(ping(),3000)
有效超时的示例:
window.setTimeout(function(){console.log('PING')},3000)
function ping(){console.log('PING')};window.setTimeout(function(){ping()},3000)
现在我的问题:为什么?我理解为什么普通代码可能需要包含在函数中,但为什么总是需要将代码括在function(){}
中?
答案 0 :(得分:1)
并不总是需要匿名功能。您还可以传递函数引用作为第一个参数,例如,假设您定义了一个名为log
的函数。你可以有效地写:
function log()
{
console.log( 'PING' );
}
window.setTimeout( log, 200 );
请注意,我们不会在此处使用第一个参数传递括号。
但是,在这个实例中,您无法将参数直接传递给log()
,因此需要将函数调用包装在匿名函数中。
答案 1 :(得分:0)
基本上因为setTimeout
是一个异步操作,并且您需要在超时完成后给下一步做什么(即您提供回调函数)
除非JavaScript运行时可以阻止UI线程并在setTimeout
结束后继续执行,否则在异步操作完成后,您需要提供一些可执行代码来执行操作:< / p>
setTimeout(function() {
// Do stuff after 1 second
}, 1000);
另一方面,将一个function
返回值作为参数的重点是什么?检查此错误代码是否更具说明性:
// You do some action even BEFORE the timeout operation has been completed?
setTimeout(doStuff(), 1000);
答案 2 :(得分:0)
代码需要包含在函数中,因为setTimeout函数不执行单独的代码行。它需要两个参数 - 第一个参数是回调函数,第二个参数是以毫秒为单位的时间。在经过指定的时间后,setTimeout函数将在内部调用回调函数。
在你给出的例子中
window.setTimeout(function(){console.log('PING')},3000)
您传递 匿名 功能,该功能将在3000毫秒或3秒后调用。
答案 3 :(得分:0)
它不需要包含在function(){}
中,但它确实需要是Function
类型的参数。
在window.setTimeout(console.log('PING'),3000)
的情况下,会发生console.log()
将立即执行并且返回值(undefined
)将传递给setTimeout
功能。此代码未将函数作为参数传递,它将函数的返回值作为参数传递。从本质上讲,这只是一种较短的写作方式:
var retVal = console.log('PING'); // retVal === undefined
window.setTimeout(retVal,3000);
setTimeout
并不特别。 console.log
without()是一个函数,但console.log()
表示调用该函数。
还有其他方法可以将函数传递给setTimeout
,但匿名函数通常是最干净的。
从技术上讲,这也可行:
window.setTimeout(console.log,3000)
但它不允许你指定一个参数,这使它在这里没用。这可以通过绑定参数来避免:
window.setTimeout(console.log.bind(null,'PING'),3000)
在这种情况下,bind
是一个被调用的函数(正如你可以看到它提供的参数),就像在bind
之前立即执行一样。但是,bind
是一个函数,其返回值本身就是一个函数,它返回的函数传递给setTimeout
并在三秒后调用。这种技术(您将看到与bind,call和apply一起使用)被称为部分应用程序,这实际上只是意味着您将一些参数转换为一个函数,该函数采用较少的参数(在这种情况下,零参数)现在指定参数但稍后执行该函数。
答案 4 :(得分:-1)
因为setTimeout
是一个带有两个参数的函数 - 一个函数,以及该函数执行前的秒数。
https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout
参数:
func:定时器到期后要执行的函数。
代码:An 可选语法允许您包含字符串而不是函数, 这是在计时器到期时编译和执行的。这个语法是 不推荐使用eval()作为安全性的相同原因 风险。
延迟:可选时间,以毫秒为单位(千分之一秒) 第二个),计时器应该在指定的函数或代码之前等待 被执行。如果省略此参数,则使用值0。注意 实际延迟可能更长;查看延误的原因更长 比下面指定的。
param1,...,paramN可选附加 传递给func指定的函数的参数 一旦计时器到期。
显然你可以使用代码,按照上面的第二个论点,但我从未见过它。