setTimeout()JavaScript方法究竟如何工作?

时间:2015-06-23 13:31:59

标签: javascript

我不是那么喜欢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() 用于函数调用?

4 个答案:

答案 0 :(得分:5)

exports.config = { seleniumAddress: 'http://localhost:4444/wd/hub', specs: ['spec.js'], capabilities: { browserName: 'chrome' } } 是函数的引用,而simpleMessage执行函数。 simpleMessage()需要功能参考才能稍后调用。

为了使事情变得更加明显,你可以把你的函数声明写成

setTimeout

请参阅setTimeout documentation

答案 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)

javascript中的

setTimeout在设置为第二个参数的特定时间后执行该函数,而如果与setInterval一起使用,它将间隔执行,而不考虑函数是否被执行或不(例如,如果您使用动画,这将导致粗糙)。

作为第二个问题的问题:如果您使用带括号的函数,这是一个方法调用,而不使用括号则是对特定方法的引用。