繁体   English   中英

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

[英]Why does ` give me a syntax error

我正在尝试在JavaScript中使用计时器,但是发生语法错误,我不知道为什么

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

您使用的是反引号,而不是常规引号。 另外,传递给setTiemoutsetInterval的第一个参数可以是字符串,但这是错误的形式。 您应该直接传递一个函数:

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)

这表明,与数组或任何对象一样,函数只是具有其原型的一种特定对象。 这就是为什么他们是一流的。

用反引号字符分隔的字符串是模板文字,并且在ES2015中新引入。 尤其是它们不受普遍支持:Internet Explorer的任何版本均不支持它们。

大概您使用的是不支持模板文字的IE(或其他浏览器的旧版本)。

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

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

…但是传递字符串的另一个名称是eval 太慢了 它可以在范围上做一些奇怪的事情。 可能很难调试。

请参阅mdn文档

 var intervalID = scope.setInterval(func, delay[, param1, param2, ...]); var intervalID = scope.setInterval(code, delay); 

功能
每延迟毫秒执行一次的功能。


可选语法允许您包含字符串而不是函数,该函数每延迟毫秒编译和执行一次。 不建议使用此语法,其原因与使用eval()构成安全风险的原因相同。

传递一个函数代替:

var timer = setInterval(changeLights,3000);

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

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

您将需要改变

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

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

应该用引号引起来。

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

  1. :匿名函数
  2. :对函数的引用。

要引用函数,只需键入它们的名称而不用方括号,然后您将得到以下代码: var timer = setInterval(changeLights,3000);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM