2010-04-18 9 views

Respuesta

5

Cree que el uso de un cierre:

function f() { 
    var x = 0; 
    return function() {return x++;}; 
} 

A continuación, utilice la siguiente manera:

> g = f() 
function() {return x++} 
> g() 
0 
> g() 
1 
> g() 
2 
+1

@OP: Esta es la forma correcta de hacer esto. Tenga en cuenta, sin embargo, que hay un costo involucrado: cada llamada a 'f' crea una * nueva * función, que puede tener implicaciones de memoria. No puede confiar en las implementaciones reutilizando el código subyacente y simplemente creando un nuevo entorno para él cada vez (y de hecho, no creo que la mayoría lo haga, de mis experimentos informales). Así que está la compensación, puedes obtener una variable verdaderamente privada, pero a un costo de memoria. No es importante si no habrá muchos de estos, pero significativos si los hay. –

0

Aquí es una aplicación verdaderamente privadas

(function() { 

     var privateVar = 0; 

     window.getPreviousValue = function(arg) { 
      var previousVal = privateVar; 
      privateVar = arg; 
      return previousVal; 
     } 

    })() 

    alert(getPreviousValue(1)); 
    alert(getPreviousValue(2)); 

Saludos

+0

Esto no creará una variable * privada *. Será accesible desde el exterior. –

+0

@max - Estaba aclarando eso como usted comentó. Gracias. –

+0

Si bien siempre es una buena idea recordarle a las personas que las funciones son objetos, su primer ejemplo ni siquiera es "privilegiado", es completamente público. * Cualquier cosa * puede mirar 'foo.privateVar'. –

1
var accumulator = (function() { 
    var accum = 0; 

    return function(increment) { 
     return accum += increment; 
    } 
})(); 

alert(accumulator(10)); 
alert(accumulatot(15)); 

Muestra 10 a continuación 25.

+1

Supongo que mostrará 10 y luego 25? –

+0

@Artem: Sí, supongo que sí, puedo programar No puedo escribir. – AnthonyWJones

0

no estoy seguro de si he entendido bien, pero tal vez algo como esto haría el truco:

function Foo() { 
    var x = "some private data"; 
    return { 
    getPrivateData : function(){ 
     return x; 
    } 
    }; 
}; 

var xx = new Foo(); 
xx.getPrivateData(); 
Cuestiones relacionadas