Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di Linusss
    Registrato dal
    Sep 2002
    Messaggi
    405

    Cambiare scope ad una funzione

    E' possibile cambiare lo scope di una funzione in modo che lo stesso della funzione che la eseguirà?
    Esempio:
    codice:
        var doSomething=function(){
            alert(x);
        }
        
       function Test(){
            var x=10;
            Test.prototype.method=doSomething;
        };
    	
        var t=new Test();
        t.method() //mi aspetto alert(10) ma ovviamente mi da errore "x is not defined"
    In pratica vorrei che lo scope di "doSomething" fosse quello interno di Test, e che quindi la variabile x sia quella privata di Test.
    L'unica soluzione che funziona(per modo di dire perchè non va su IE) è di utilizzare eval.

    In teoria lo scope di "doSomething" è una "catena" di due oggetti scope, prima quello interno di doSomething e poi quello globale,io vorrei aggiungiure fra i due un altro anello, ossia lo scope interno di Test.
    E' possibile tutto ciò?
    Forum Additive monitora le discussioni più importanti!

  2. #2
    sicuramente ci avrai già pensato, ma l'unica maniera che mi viene in mente di rendere accessibile la variabile x è o rendere la funzione membro della classe, o rendere la variabile globale.
    ciao
    sergio

  3. #3
    Utente di HTML.it L'avatar di Linusss
    Registrato dal
    Sep 2002
    Messaggi
    405
    Ciao, lo so che così funzionerebbe, ma la funzione "doSomething" è già definit all'estrno di Test(anzi in realtà si trova in un literal object con scope globale) e la x ovviamente deve essere varioabile PRIVATA di Test.

    Mi sa che non c'è soluzione se non quella di usare eval, che è una "non" soluzione.
    Forum Additive monitora le discussioni più importanti!

  4. #4
    Apparte il fatto che ridefinire il prototype nella stessa classe ha poco senso, lo scope di Test non può essere recuperato se non usando un "ponte" globale o più semplicemente passando la variabile che ti serve come argomento:
    Codice PHP:
        var doSomething=function(x){
            
    alert(x);
        }
        
       function 
    Test(){
            var 
    x=10;
            
    this.method=function() { doSomething.call(thisx); };
        };
        
        var 
    t=new Test();
        
    t.method() 
    Ti sconsiglio eval.

  5. #5
    Utente di HTML.it L'avatar di Linusss
    Registrato dal
    Sep 2002
    Messaggi
    405
    Però se "doSomething" deve modificare la variabile privata quella soluzione non va più bene.

    Volevo approffondire una cosa, come mai dici che non ha senso definire il prototype direttamente dentro la classe?
    Mi sembra sia l'unico modo per accedere alle variabili private della classe, ma a livello di interpretazione del codice da parte del browser cambia qualcosa ridefinire il prototype fuori o dentro la classe?
    Forum Additive monitora le discussioni più importanti!

  6. #6
    Potrebbe avere senso se vuoi che tutte le istanze abbiano un metodo con lo stesso scope, altrimenti è molto più efficace creare un metodo privilegiato che appartiene a questa unica istanza.

    Per quanto riguarda il problema che non puoi settare x all'interno di doSomething mi viene in mente questa soluzione:

    codice:
    var doSomething=function(x){
            alert(x);
            return x;
        }
        
       function Test(){
            var x=10;
            this.method=function() { x = doSomething.call(this, x); };
        };
        
        var t=new Test();
        t.method()

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.