2010-06-12 6 views
5

He estado tratando de aprender cierres (en Javascript), lo que hace daño a mi cerebro después de muchos años con C# y C++. Creo que ahora tengo un conocimiento básico, pero una cosa me molesta: he visitado muchos sitios web en esta Búsqueda del Conocimiento, y en ninguna parte he visto una palabra (o incluso una frase simple de dos palabras) que significa "un conjunto". de cierres de Javascript que comparten un contexto de ejecución común ". Por ejemplo:¿Cómo se llama un conjunto de cierres de Javascript que comparten un contexto común?

 
function CreateThingy (name, initialValue) 
{ 
    var myName = name; 
    var myValue = initialValue; 

    var retObj = new Object; 

    retObj.getName = function() { return myName; } 
    retObj.getValue = function() { return myValue; } 
    retObj.setValue = function(newValue) { myValue = newValue; } 

    return retObj; 
}; 

Según lo que he leído, esta parece ser una forma común de implementar el ocultamiento de datos. El valor devuelto por CreateThingy es, por supuesto, un objeto, pero ¿cómo llamarías al conjunto de funciones que son propiedades de ese objeto? Cada uno es un cierre, pero quisiera un nombre que pueda usar para describir (y pensar) todos juntos como una entidad conceptual, y prefiero usar un nombre comúnmente aceptado que inventar uno.

Gracias!

- Ed

Respuesta

3

Crockford popularizó el término "privileged method" para nombrar las funciones que tienen acceso al alcance de su constructor (donde la los miembros privados son declarados).

Los llamaría "Un conjunto de funciones de JavaScript que comparten un ámbito de delimitación común".

El "contexto de ejecución" parte de la frase que publique, puede crear confusión entre el Execution Contexts descrito en la memoria, el valor this, que también se conoce popularmente como "el contexto función" o "objeto contexto ", y el alcance de la función, que es realmente lo que se está haciendo referencia aquí.

0

Está cerca del módulo patrón. Utilizar una expresión de este modo:

var thingy = (function(specObj) { 
    var my = {}, 
     privateVar = blah, 
     someOtherPrivateVar = []; 

    my.getSomeVal() { 
     return specObj.someVal; 
    } 
    my.getAnotherVal() { 
     return specObj.AnotherVal; 
    } 
}({ 
    someVal: "value", 
    anotherVal: "foo" 
})); 

que inicializa con un objeto literal porque el uso de un objeto con nombre permitiría al estado de manivela a ser cambiado al cambiar el objeto nombrado. Hay otras opciones para hacer esto.

Aquí hay otro buen enlace en variaciones del patrón de módulo: http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth

sobra decir, pero Crockford Javascript: las partes buenas contiene un buen tratamiento de este estilo y sus beneficios específicos.

Cuestiones relacionadas