簡體   English   中英

跨函數jQuery涉及的javascript變量范圍

[英]javascript variable scope across functions jQuery involved

這是我無法工作的-在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();

我可以將該事件傳遞給假定的類實例嗎,還是沒有辦法完成?

我還要提一下,我在這里試圖避免使用全局范圍變量。

三件事:

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-使用對象

當你傳遞的方法等this.mouseMove作為一個回調函數,它不再依賴於實例-所以this將是全局對象。 要修復作用域,您可以在閉包中傳遞實例,如下所示:

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

嘗試:

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();
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才能在構造函數中實例化

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM