我有一个很大的Javascript项目,我正在尝试重构为伪类:
jsFiddle:http://jsfiddle.net/waitinforatrain/7T42w/
var MyNameSpace = {}
MyNameSpace.MyClass = function() {
this.doSomething = function () {
return "hello";
}
this.doSomething2 = function() {
var x = this.doSomething() + " world";
alert(x);
}
this.doSomething2(); //Works fine
$("#mydiv").click ( this.doSomething2 ); //Doesn't work
}
var class = new MyNameSpace.MyClass();
点击事件导致错误的原因是this
引用#mydiv
元素。
我应该如何设计上述内容,以便我可以访问被点击的元素,但也可以调用doSomething()
?
答案 0 :(得分:6)
您需要缓存上下文引用并将调用包装在闭包中:
var MyNameSpace = {}
MyNameSpace.MyClass = function() {
var context = this;
context.doSomething = function () {
return "hello";
}
context.doSomething2 = function() {
var x = context.doSomething() + " world";
alert(x);
}
// You can do this:
context.doSomething2();
// Or this:
$("#mydiv").click(function(e) {
context.doSomething2();
});
}
答案 1 :(得分:2)
this.doSomething2 = $.proxy(function() {
var x = this.doSomething() + " world";
alert(x);
}, this);
$ .proxy将this
范围绑定到所述函数内的上下文变量。
答案 2 :(得分:0)
在外部范围内保存对this
的引用:
MyNameSpace.MyClass = function() {
var that = this;
this.doSomething = function () {
return "hello";
}
this.doSomething2 = function() {
var x = that.doSomething() + " world";
alert(x);
}
this.doSomething2(); //Works fine
$("#mydiv").click ( this.doSomething2 ); //Doesn't work
}
分配给doSomething2
的函数被称为“关闭”其词法范围中的变量,因此即使MyClass
返回,也可以访问它们的值。这允许我们通过对我们分配给doSomething
的实例的引用来访问that
方法。