我试图在javascript中使用计时器但是语法错误正在发生,我不知道为什么
var timer = setInterval(`changeLights()`,3000);
答案 0 :(得分:5)
你正在使用反引号而不是常规引号。此外,传递给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)
这表明,与数组或任何对象一样,函数只是具有自己原型的特定类型的对象。这就是为什么他们是一流的。
答案 1 :(得分:2)
以反引号字符分隔的字符串为template literals,并在ES2015中新引入。它们并非普遍受到支持,特别是:没有版本的Internet Explorer会支持它们。
据推测,您使用的IE(或其他浏览器的旧版本)不支持模板文字。
你可以(但不应该)使用常规字符串文字:
var timer = setInterval("changeLights()",3000);
...但是传递一个字符串是eval
的另一个名字。这很慢。它可以用范围做奇怪的事情。它可能很难调试。
var intervalID = scope.setInterval(func, delay[, param1, param2, ...]); var intervalID = scope.setInterval(code, delay);
func
每延迟毫秒执行一次的函数。代码
可选语法允许您包含字符串而不是函数,每次延迟都会编译和执行 毫秒。建议不要使用此语法,原因与此相同 使用eval()存在安全风险。
改为传递函数:
var timer = setInterval(changeLights,3000);
答案 2 :(得分:0)
我假设你在某个地方有changeLights
功能。如果您收到函数未定义的错误,那是因为定义为字符串的函数将在窗口的上下文中执行。如果你有一个作用域定义的函数,你应该将你的第一个参数封装在一个可以在词法上访问你的函数的本地函数中,如:
var timer = setInterval(function() { changeLights() },3000);
答案 3 :(得分:-2)
您需要更改
var timer = setInterval(`changeLights()`,3000);
到
var timer = setInterval('changeLights()',3000);
它应该在引号中。
答案 4 :(得分:-3)
这不是它的工作原理。 setInterval()
的第一个参数是
要引用功能,您只需键入不带括号的名称,执行此操作后,您最终会得到以下代码:var timer = setInterval(changeLights,3000);