涉及jQuery函数的javascript变量范围

时间:2011-06-25 13:44:16

标签: javascript jquery

这是我无法工作的 - 在mouseMove this.mouseX是未定义的。我需要mousemove事件中的mouseX和mouseY(代码中的e.pageX)。

function myClass () {
    var mouseX=x;
    var mouseY=y;
    $(document).mousemove(this.mouseMove);
}
myClass.prototype.mouseMove = function(e){
    this.mouseX=e.pageX;//not a good idea but you can alert this
}
var a=new myClass();

我可以将该事件传递给假定的类实例,或者无法完成它吗?

我还应该提一下,我试图在这里避免全局范围变量。

4 个答案:

答案 0 :(得分:1)

两个三件事:

var mouseX仅声明myClass函数的本地变量 。您必须使用this.mouseX声明实例的属性(this引用当前实例):

function myClass () {
    this.mouseX=x;  // where do x and y come from?
    this.mouseY=y;
    //...
}

其次,请确保将xy作为参数传递给构造函数。否则你会收到一个错误(如果它们没有在更高的范围内定义,但这对我来说似乎没用)。

第三,如果您只是将this.mouseMove作为事件处理程序传递,则在事件处理程序中,this将引用window而不引用myClass实例。使用$.proxy显式设置回调的上下文:

function myClass(x, y) {
    this.mouseX=x;
    this.mouseY=y;
    $(document).mousemove($.proxy(this.mouseMove, this));
}

我建议阅读MDC - Working with objects

答案 1 :(得分:0)

当您将this.mouseMove之类的方法作为回调函数传递时,它不再与实例绑定 - 因此this将成为全局对象。要修复范围,可以在闭包中传递实例,如下所示:

function myClass (x,y) {
    var mouseX=x;
    var mouseY=y;
    var that = this;
    $(document).mousemove(function() { that.mouseMove() });
}

答案 2 :(得分:0)

尝试:

function myClass (x,y) {
    var mouseX=x;
    var mouseY=y;
    var $this = this;

    $(document).mousemove(function(){$this.mouseMove()});
}
myClass.prototype.mouseMove = function(e){
    this.mouseX=e.pageX;//not a good idea but you can alert this
}
var a=new myClass();

答案 3 :(得分:0)

function myClass () {
    this.mouseX=x;
    this.mouseY=y;
    $(document).mousemove(this.mouseMove);
}
myClass.prototype.mouseMove = function(e){
    this.mouseX=e.pageX;//not a good idea but you can alert this
}
var a=new myClass();

您需要在构造函数

中使用this关键字而不是var来实例化