尽管其他人已经在上面介绍了这一点,但 window.setTimeout() 和 window.setInterval() 都需要函数引用。相反,您的代码提供了函数调用的返回值。
当您希望调用或调用 JavaScript 函数时,您可以按预期编写:
DoMyfunction();
JavaScript 引擎将在遇到该行时执行该函数。
但是, setTimeout() 和 setInterval() 需要的是对与您的函数相对应的函数对象的引用。您通过以下方式获得,以及类似的方式:
myFunc = DoMyFunction;
该行将对与 DoMyFunction() 对应的函数对象的引用复制到一个新变量中。然后您可以将其传递给 setInterval() 和 setTimeout(),即:
丢弃 = window.setTimeout(myFunc, 1000);
上面那一行将指示 JavaScript 引擎在 1 秒后执行您想要的函数(即 DoMyFunction())一次,并且:
丢弃 = window.setInterval(myFunc, 1000);
将指示 JavaScript 引擎重复执行您的预期功能,每秒一次。
当然,您可以在不使用新变量的情况下实现相同的效果,如下所示:
丢弃 = window.setTimeout(DoMyFunction, 1000);
等等。
但是,如果您错误地使用了:
丢弃 = window.setTimeout(DoMyFunction(), 1000);
相反发生的是 DoMyFunction() 被执行,并且由此产生的任何返回参数然后被传递给 window.setTimeout() 函数。由于 window.setTimeout() 期望在此处传递一个函数对象引用,而是接收您的函数返回的任何内容(如果您的函数不返回任何内容,则接收未定义的内容),那么由 setTimeout()(和 setInterval())执行的内部检查将揭示它在这里没有收到函数对象引用,只是默默地中止。
当然,如果 DoMyFunction()确实返回了一个有效的函数对象,则可能会出现一个更隐蔽的错误!如果您已经编写了 DoMyFunction() 来执行此操作,那么该函数对象将被传递给 setTimeout(),并且该函数将被运行!当然,您可以有意使用它,并将您的 DoMyFunction() 编写为一个闭包,返回您希望 setTimeout() 作为函数对象返回参数执行的实际函数,如果您使用该方法,则形式如下:
丢弃 = window.setTimeout(DoMyFunction(), 1000);
将不再出错。
请记住,您在代码中编写的每个JavaScript 函数,当解析该代码时,JavaScript 引擎都会将其与一个函数对象相关联。要执行该函数,请使用:
DoMyFunction();
要改为引用函数对象,请使用:
DoMyFunction;
这些 () 可以根据上下文产生巨大的差异,这是 JavaScript 采取这种方法来区分函数对象引用和函数执行指令的结果。