Javascript 为什么`给我一个语法错误

Javascript 为什么`给我一个语法错误,javascript,html,Javascript,Html,我试图在javascript中使用计时器,但是出现了语法错误,我不知道为什么 var timer = setInterval(`changeLights()`,3000); 这不是它的工作原理。setInterval()的第一个参数是 :匿名函数 :对函数的引用 要引用函数,只需键入不带括号的函数名,这样做会得到以下代码:var timer=setInterval(changeLights,3000)您需要更改 var timer = setInterval(`changeLights()`,

我试图在javascript中使用计时器,但是出现了语法错误,我不知道为什么

var timer = setInterval(`changeLights()`,3000);

这不是它的工作原理。
setInterval()
的第一个参数是

  • :匿名函数
  • :对函数的引用

  • 要引用函数,只需键入不带括号的函数名,这样做会得到以下代码:
    var timer=setInterval(changeLights,3000)

    您需要更改

    var timer = setInterval(`changeLights()`,3000);
    


    应该用引号

    您正在使用反勾号而不是常规引号。此外,传递给
    setTiemout
    setInterval
    的第一个参数可以是字符串,但形式不好。您应该直接传递函数:

    var timer = setInterval(changeLights,3000);
    
    在JS中,函数是一流的。这意味着它们可以像变量一样被传递。如果出于某种原因,您希望/需要传递字符串,请使用普通的单引号/双引号,而不是反勾号:

    var timer = setInterval('changeLights()',3000); // but this is bad form
    
    如果您想更深入地研究此问题,请尝试以下方法:

    var foo = function() {
        console.log('foo is invoked');
    };
    console.log(Object.getPrototypeOf(foo))
    console.log(Object.getPrototypeOf(foo) === Function.prototype)
    console.log(Object.getPrototypeOf(Object.getPrototypeOf(foo)))
    console.log(Object.getPrototypeOf(Object.getPrototypeOf(foo)) === Object.prototype)
    

    这表明,与数组或任何对象一样,函数只是具有自己原型的特定类型的对象。这就是为什么它们是头等舱。

    我假设您在某处有一个
    changeLights
    函数。如果出现未定义函数的错误,这是因为定义为字符串的函数将在窗口上下文中执行。如果您有一个范围定义的函数,您应该将第一个参数封装在一个本地函数中,该函数可以按词汇访问您的函数,如下所示:

    var timer = setInterval(function() { changeLights() },3000);
    

    ES2015中新引入了以反勾号字符分隔的字符串。它们并没有得到普遍支持,特别是:没有任何版本的Internet Explorer支持它们

    您可能正在使用不支持模板文本的IE(或其他浏览器的旧版本)

    您可以(但不应该)使用常规字符串文字:

    var timer = setInterval("changeLights()",3000);
    
    …但是通过另一个名称传递字符串是
    eval
    。它很慢。它可以用范围做一些奇怪的事情。调试可能很困难

    见:

    func
    每延迟毫秒执行一次的函数

    代码
    可选语法允许您包含字符串而不是函数,函数会在每次延迟时编译和执行 毫秒。不建议使用此语法,原因与 使使用eval()成为一种安全风险

    改为传递函数:

    var timer = setInterval(changeLights,3000);
    


    如果要将函数作为字符串传递,请删除引号。是否要使用记号?bowser支持他们吗?1和2是一样的。它还应该接受一个字符串。1和2不是一回事不建议使用字符串。函数是函数。不管它是否匿名。它将始终是对它的引用。可能不推荐使用,但这与“它不是这样工作的”不同,这是不准确的。为什么在匿名函数中使用wrap
    changeLights
    ?为什么不直接将其作为参数传递呢?这是一个建议,因为下一次他将希望将参数传递给
    changeLightStrength(10)
    函数,并且他不希望将10绑定到第一个参数:)第二个参数不起作用,因为您需要用括号表示字符串值。这与使用
    eval
    @NinaScholz进行的评估是一样的,很公平,再次将它们添加回来。。。。我从不使用字符串语法:)@Aria-第一个在backtick中,第二个在single quote中。为什么这会被否决,除了它不能解释不是所有浏览器都支持tick之外?@SudiptaMondal抱歉,是的,但它的形式不好,浏览器支持怎么样。@Aria我相信,单引号在任何地方都有效,反勾号到目前为止还不起作用。@epascarello我想这是被否决的,因为尽管它有效,但可以说这是解决问题最糟糕的方法。JS在很大程度上是一种函数式语言,应该像suchI完全同意的那样使用,我只想补充一点,如果作者想将参数传递给被调用的函数,那么它需要包装在一个匿名函数中,所以我要么添加一个例子,要么只是提到它。@Alex-他们没有(事实并非如此,您可以改用
    bind
    ,这通常会更好,因为它避免了可能令人困惑的闭包)@Alex即使没有任何显式bind()参数也会被传递给函数的参数我并没有说这是不可能的,也没有说很难将参数传递给这种形状的函数。我只是说,在制定答案时考虑提问者的语言理解水平可能是值得的
    var intervalID = scope.setInterval(func, delay[, param1, param2, ...]);
    var intervalID = scope.setInterval(code, delay);
    
    var timer = setInterval(changeLights,3000);