2013-07-16 6 views
6

ho simulato una classe in java script, E 'il codice è qui:Come passare una variabile facendo riferimento a un gestore di eventi in javascript?

function myclass() 
{ 
    this.count ; 

    this.init = function(){ 
     $("div.mybtn").click({n:this},function(e){ 
      e.data.n.count++; 
     }); 
    } 

    this.getCount = function(){ 
     alert(this.count); 
    } 
} 

Poi ho creato un'istanza di questa classe ed eseguito è il metodo init(), ma quando si fa clic su qualsiasi elemento div.mybtn, non incrementa la valore di this.count.
Sembra che l'oggetto this sia stato passato al gestore eventi per valore non per riferimento.
Come posso passare una variabile a un gestore di eventi per riferimento?

Grazie per qualsiasi aiuto

risposta

2

Javascript non ha parametri di riferimento pass-by-riferimento. Per ciò che si vuole, è necessario utilizzare una variabile di chiusura:

this.init = function(){ 
    var self = this; 
    $("div.mybtn").click(function(){ 
     self.count++; 
    }); 
} 
1

È possibile scrivere una funzione di associazione e associare il contesto al gestore eventi.

Function.prototype.bind = function(){ 
    var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift(); 

    return function(){ 
     fn.apply(object, args.concat(Array.prototype.slice.call(arguments))); 
    } 
} 

function myclass() 
{ 
    this.count ; 

    this.clicked = function(){ 
     this.count++;  
    }; 

    this.init = function(){ 
     $("div.mybtn").click(this.clicked.bind(this)); 
    } 

    this.getCount = function(){ 
     alert(this.count); 
    } 
} 
4

Non si può incrementare undefined, si deve cominciare da qualche parte:

function myclass() { 
    this.count=0; // start counting at zero !!! 

    this.init = function(){ 
     $("div.mybtn").on('click', {n:this},function(e){ 
      e.data.n.count++; 
      e.data.n.getCount(); 
     }); 
    } 

    this.getCount = function(){ 
     console.log(this.count); 
    } 
} 

var c = new myclass(); 

c.init() 

DEMONSTRATION

+0

ho provato pure, e le opere va bene. – adeneo