每次触发setInterval时都会发生SyntaxError

时间:2014-03-17 00:40:56

标签: javascript syntax timer syntax-error setinterval

我试图用JavaScript为游戏编写简单的AI。 (游戏不是我的。)以下是我的代码到目前为止AI的范围:

function AIManager(grid) {
  this.events = {};
  this.grid = grid;

  setInterval(new function(){console.log("hello")}, 1000);
}

当我尝试运行游戏时,控制台输出"你好"

一次
Uncaught SyntaxError: Unexpected identifier

每秒一次,没有附加堆栈跟踪或行号。 (当我将间隔设置为1 ms而不是1000 ms时,此错误每1 ms打印一次,因此它肯定会响应setInterval函数。)

有谁能帮我理解为什么会这样?我现在有点像javascript noob ...谢谢!

2 个答案:

答案 0 :(得分:3)

在这种情况下,不需要new

setInterval()期待Function function expression已经创建。

setInterval(function(){console.log("hello")}, 1000);
// logs 'hello'
// logs 'hello'
// ...

"hello"使用new记录一次,因为它会立即作为构造函数调用Function

var o = new function () {
    console.log("hello");
};
// logs "hello" during construction

console.log(typeof o); // "object"

并且SyntaxError可能是因为setInterval(),发现参数不是Function,正在将实例Object转换为String它可以eval uate:

setInterval(new function () {
    this.toString = function () {
        return "console.log('foo');";
    };
}, 1000);
// logs 'foo'
// logs 'foo'
// ...

注意:由于计时器(setTimeout()setInterval())实际上并未标准化,因此前一个代码段中的行为在引擎之间可能不一致。

答案 1 :(得分:0)

意外标识符为{}

表达式的结果

new function() { console.log("hello"); }

是一个空对象({}),您可以在控制台中验证该对象。然后将该空对象作为第一个参数传递给setInterval

setInterval({}, 1000);

setInterval expects either a string or a function,不是对象。所以,由于{}不是一个函数,它将它传递给Function构造函数以试图获得它可以执行的函数,la:

new Function({})

该陈述的结果是您未被捕获的SyntaxError