
[英]Why does this script increment y and not give a, for me expected, syntax error?
[英]Why does ` give me a syntax error
我正在尝试在JavaScript中使用计时器,但是发生语法错误,我不知道为什么
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)
这表明,与数组或任何对象一样,函数只是具有其原型的一种特定对象。 这就是为什么他们是一流的。
用反引号字符分隔的字符串是模板文字,并且在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()
的第一个参数是
要引用函数,只需键入它们的名称而不用方括号,然后您将得到以下代码: var timer = setInterval(changeLights,3000);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.