我正在编写一些画布代码来绘制圆圈,但它从未被绘制过。最后我发现这是因为我输入了Math.Pi
而不是Math.PI
。
在Chrome开发者工具中,我可以看到Math.Pi
是undefined
,但它从未引发任何异常。这是Chrome中的错误还是在undefined
上进行计算实际上是合法的?
这是我的代码:
ctx.save();
ctx.lineWidth = 2;
ctx.fillStyle = '#FF0000';
ctx.beginPath();
ctx.arc(can.x, can.y, 15, 0, Math.Pi * 2, true);
ctx.fill();
ctx.restore();
ctx
是指canvas.getContext("2d");
。
答案 0 :(得分:6)
undefined * 2
评估为NaN
,而canvas 2D context specification表示:
除非另有说明,否则对于2D上下文接口,任何使用数值参数的方法调用,其值为无穷大或 NaN值必须忽略。
因此,带有ctx.arc
参数的NaN
调用意味着默认忽略调用(即没有绘制任何内容),而不是抛出错误。
答案 1 :(得分:2)
这是Javascript的工作方式。
虽然引用未声明的变量会引发异常,但访问不存在的变量
属性将返回undefined
。
alert(window.foo); // alerts 'undefined'
alert(foo); // exception: foo is not defined
请注意,例外的措辞令人困惑。它应该说“未宣布”。
现在,Javascript旨在抛出极少的错误。这就是为什么它可以乘以undefined
。 According to the specs,这将返回NaN
。
答案 2 :(得分:1)
从技术上讲,这不是错误,但会导致NaN
。
答案 3 :(得分:1)
Math.Pi
未定义。使用未定义的算术运算时,会产生NaN
并且不会生成任何异常。因此,使用undefined进行计算是合法的。
var o = {};
var y = o.x + 10; // o.x is undefined and thus y is NaN