Javascript函数上下文
Javascript function context
我用画布创建了一个简单的移动粒子。
代码:
var c = document.getElementById('game'),
ctx = c.getContext('2d');
var Particle = function(x, y) {
this.x = x;
this.y = y;
this.color = 'tomato';
}
Particle.prototype.update = function(i) {
console.log(p.length);
this.x++;
this.y++;
if (this.y > 400) {
p.splice(i, 1);
}
}
var p = [];
for (var i = 0; i < 5; i++) {
p.push(new Particle(i * 10, i * 50));
}
Particle.prototype.render = function() {
ctx.save();
ctx.beginPath();
ctx.fillStyle = this.color;
ctx.arc(this.x, this.y, 3, 0, 2 *
Math.PI);
ctx.fill();
ctx.restore();
}
function draw() {
ctx.clearRect(0, 0, 400, 400);
for (var i = 0; i < p.length; i++) {
p[i].update(i);
// STATEMENT 1
p[i].render();
// STATEMENT 2
Particle.prototype.render.call(
p[i]);
}
}
首先,STATEMENT 1和STATEMENT 2都调用render函数。我的问题是对于STATEMENT 1,它显示控制台错误
Uncaught TypeError: Cannot read property 'render' of undefined
但是STATEMENT 2工作正常,没有任何错误。我能知道原因吗?
Thanks in Advance
当你遍历p的时候,你已经修改了p的内容。这通常是个坏主意,正是它导致了你的问题。
由于您正在将元素拼接出数组,但是当数组在draw函数中完成迭代时,对象不再存在。得到p[i],它可能已经不存在了。更糟糕的是,你的update数组正在请求一个索引,而你没有传递这个索引。
最简单的方法是反转遍历数组的方式:
for (var i = p.length; i > 0; --i) {
// cache a copy in case it goes away.
var pPoint = p[i];
// still bad form.
pPoint.update(i);
pPoint.render();
}
总的来说,我认为你可能有更多的问题。
相关文章:
- 将函数的上下文应用于javascript变量
- 是否可以在不更改上下文的情况下调用函数.apply
- 调用$.each()函数时上下文发生变化
- 如何向onClick事件处理程序传递一个接受参数的函数,并且仍然将该函数绑定到组件's”;这个“;上下文
- 访问函数对象的上下文属性|如何
- 构造函数函数中的自执行函数的OO上下文/范围
- 覆盖上下文.属性和函数
- 对象方法中函数中的上下文
- node.js中的箭头函数上下文
- extjs中事件处理程序函数中的THIS上下文
- 使用数组-apply()中的参数调用函数,但不使用上下文参数
- 函数调用上下文
- 如何使用子窗口上下文执行在父窗口中定义的函数
- 为什么Chrome无法(或can)在ES6的Arrow函数中找到上下文
- 如何创建一个原型函数,将另一个原型函数绑定为语法糖(并保持实例的上下文)
- 在 mongo map 中调用外部 javascript 函数(对象)或减少上下文的可能方法
- 函数参数的 JavaScript 执行上下文
- 是否可以绑定javascript函数,使其本地上下文与“this”相同
- 上下文菜单项上下文函数未执行
- D3js:鼠标悬停对象上下文(函数指针)