我试图用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 ...谢谢!
答案 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
。