以下是我认为简单的代码:
<html>
<head>
<script>
function Foobar(id) {
self = this;
self.id = id;
self.canvas = document.createElement('canvas');
self.canvas.style.border = '1px solid black';
document.body.appendChild(self.canvas);
self.canvas.addEventListener('mousedown', self.onMouseDown, true);
self.onMouseDown = function(e) {
console.log(self.id);
}
}
var s1, s2;
function onLoad() {
s1 = new Foobar(1);
s2 = new Foobar(2);
}
</script>
</head>
<body onload='onLoad()'>
</body>
</html>
为什么控制台没有弹出ID号?
这是一个小提琴:http://jsfiddle.net/VRn7v/
答案 0 :(得分:3)
答案 1 :(得分:2)
self
是window
对象的属性,通常是一个错误的变量名。此外,您的self
变量是隐式全局变量,因为您缺少var
关键字。最后,在声明事件处理程序之前绑定它。
function Foobar(id) {
var that = this; // pick a better name, and use "var"
that.id = id;
that.canvas = document.createElement('canvas');
that.canvas.style.border = '1px solid black';
document.body.appendChild(that.canvas);
that.onMouseDown = function(e) {
console.log(self.id);
}; // missing semicolon
// bind the handler after declaring it
that.canvas.addEventListener('mousedown', that.onMouseDown, true);
}
答案 2 :(得分:1)
self.canvas.addEventListener('mousedown', self.onMouseDown, true);
在这一行中,self.onMouseDown
为undefined
,因为您之后才会分配它。可能的快速修正工具:
onMouseDown
函数移动到原型中(错误,范围内没有本地self
)self.onMouseDown
,而是self.canvas.onmousedown
(与传统事件注册跨浏览器安全)此外,您的self
变量是全局变量。使用工作处理程序附件,两次单击都将记录"2"
。并且,在您使用它的大多数地方都不需要self
变量 - 唯一需要的是在事件处理程序中。