为什么setTimeout要求代码包含在函数中?

时间:2016-11-27 17:22:35

标签: javascript

在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(){}中?

5 个答案:

答案 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指定的函数的参数   一旦计时器到期。

显然你可以使用代码,按照上面的第二个论点,但我从未见过它。