我不是那么喜欢JavaScript而且我对 setTimeout()方法有以下疑问。
因此,我有一个测试脚本:
function simpleMessage() {
alert("This is just an alert box");
}
// settimeout is in milliseconds:
setTimeout(simpleMessage, 5000);
因此,当我执行页面时,在5秒后执行 simpleMessage()功能,并显示警告弹出窗口。
我理解当我这样做时:
setTimeout(simpleMessage, 5000);
这意味着必须在定时器设置后5秒钟后执行 simpleMessage()功能,但为什么使用 simpleMessage 而不是 simpleMessage() 用于函数调用?
答案 0 :(得分:5)
exports.config = {
seleniumAddress: 'http://localhost:4444/wd/hub',
specs: ['spec.js'],
capabilities: {
browserName: 'chrome'
}
}
是函数的引用,而simpleMessage
执行函数。 simpleMessage()
需要功能参考才能稍后调用。
为了使事情变得更加明显,你可以把你的函数声明写成
setTimeout
答案 1 :(得分:3)
setTimeout
的第一个参数是要执行的函数。标识符simpleMessage
指的是您希望setTimeout
执行的功能,因此您提供的参数是setTimeout
的参数。
如果您执行了setTimeout(simpleMessage(), 5000);
,则会立即执行simpleMessage
,然后setTimeout
会将返回值作为其第一个参数。这与:
var value = simpleMessage();
setTimeout(value, 5000);
这没有意义;它与setTimeout(simpleMessage(), 5000);
相同。
还要考虑一个返回函数的高阶函数:
function funcFacotry() {
return function() { alert("this is just an alert box."); }
}
var simpleMessage = funcFactory();
setTimeout(simpleMessage, 5000);
在这种情况下,实际上确实是有意义的,因为funcFactory
的返回值实际上是一个函数本身。
答案 2 :(得分:1)
因为您需要在5s之后传递对要调用的函数的setTimeout的引用。
此:
package main
import (
"io"
"log"
"os"
"os/exec"
)
func main() {
// Logging capability
f, err := os.OpenFile("log.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.Fatalf("Error opening file: %v", err)
}
defer f.Close()
mwriter := io.MultiWriter(f, os.Stdout)
cmd := exec.Command("ls")
cmd.Stderr = mwriter
cmd.Stdout = mwriter
err = cmd.Run() //blocks until sub process is complete
if err != nil {
panic(err)
}
}
在您调用setTimeout函数的同时执行simpleMessage函数。
答案 3 :(得分:1)
setTimeout
在设置为第二个参数的特定时间后执行该函数,而如果与setInterval
一起使用,它将间隔执行,而不考虑函数是否被执行或不(例如,如果您使用动画,这将导致粗糙)。
作为第二个问题的问题:如果您使用带括号的函数,这是一个方法调用,而不使用括号则是对特定方法的引用。