【发布时间】:2012-01-10 07:53:01
【问题描述】:
我已经将我对这种情况的缺乏理解概括为这个小问题。以下是我认为到目前为止我所知道的:
我有一个对象myDog(一个全局变量)。 Dog 有一个成员变量 el 是一个 html 元素;因为它是一个元素,所以我可以向它添加事件侦听器。因此,当您单击myDog.el 时,它会将this.name 和myDog.name 的值记录到控制台。正如预期的那样,this.name 是未定义的,myDog.name 是“tye”。 Dog.speak 内部的this 在被点击事件监听器调用时指的是被点击的元素,成员变量el,而不是对象Dog。由于myDog 是一个全局变量,因此无论函数的作用域如何,它都可以恢复并返回myDog.name。
见下面的代码:
function Dog(name,id) {
this.name = name ? name : "spot";
this.id = id ? id : "dog";
this.el = document.getElementById(this.id); // given there is a div with a matching
this.el.addEventListener("click",this.speak); // ignore IE for simplicity (attachEvent has its own 'this' scope issues)
}
Dog.prototype = {
speak: function() {
console.log("this.name: "+this.name+"\nmyDog.name: "+myDog.name);
}
};
var myDog = new Dog("tye","dog1");
所以...我的问题是
1) 将对象附加到 html 元素的一些策略是什么,以便我可以在 myDog 不作为全局变量的情况下从 this.el 回到 myDog(this.el 的所有者)?
2) 在这种情况下,全局变量是必要的吗?如果是这样,在这种情况下有什么好的策略可以优雅地使用它们?例如,如果我想要实例化 100 条狗怎么办?我将如何处理Dog.speak 中的所有这些全局变量?
如果你想玩,这里有一个 jsfiddle 版本:http://jsfiddle.net/chadhutchins/Ewgw5/
【问题讨论】:
-
解决 this 范围问题的最常见方法之一是在函数开头将“this”分配给变量...self 将始终引用原始 this。
-
感谢您的回复,但您能进一步解释一下吗?如何在上面的示例中使用该技术。
-
我也照Bones牧师说的做
标签: javascript oop events scope