2011-05-04 17 views
5

Aquí se puede acceder a JavaScript como novato.Alcance de JavaScript: haciendo referencia al miembro de objeto primario desde el cierre del miembro secundario

¿Cómo me refiero miembro de foo desde dentro foobar miembro, teniendo en cuenta que foobar 's en un cierre?

var priv = { 

    foo: "bar", 

    foobar: (function() { 
     return this.foo === "bar"; 
    })() 

}; 

El código anterior falla. En él, this.foo es undefined. Si cambio this.foo a priv.foo, sigue siendo undefined. ¿Cómo hago referencia al priv.foo desde el interior del cierre foobar?

+2

Está seguro de querer llamar a su cierre? Yo trataría de eliminar '()' después de '})' – meze

+0

Desafortunadamente, lo hago. 'foobar' es en realidad unas pocas docenas de líneas. :/ – DotNetQuestionDate

+0

Expliqué en mi respuesta a continuación – meze

Respuesta

2

Es imposible leer las propiedades de un objeto en su defination durante su inicialización ya que prev no estará definido en ese momento. Cuando intenta llamar a un clojure dentro de él, se refiere a this o priv indefinido.

Probablemente quería escribir:

foobar: (function() { 
    return this.foo === "bar"; 
}) 

sin () al final. Y entonces se le puede llamar como priv.foobar();

Si aún necesita llamarlo, se podría definir foobar después foo:

var priv = { 
    foo: "bar" 
}; 

priv.foobar = (function() { 
    return priv.foo === "bar"; 
})() 
0

El problema es que no está definiendo un cierre - No creo que haya ninguna forma de acceder a foo desde su función ya que el priv aún no se ha inicializado.

¿Qué estás tratando de hacer exactamente? El siguiente es equivalente a lo que entiendo su muestra está tratando de hacer, pero mi opinión es que no voy a entender el problema:

// Set elsewhere 
var foo = "bar"; 

var priv = { 
    foo: foo , 
    foobar: foo == "bar" 
}; 
+0

En resumen, tengo un archivo JS gigante. Define algunas variables privadas y un objeto público. Estoy intentando encapsular estas variables privadas en un objeto, pero cada variable privada, excepto una, depende del valor de otra variable privada. Por lo tanto, suponga que 'foobar' es un cálculo dinámico en tiempo de ejecución basado en el valor de' foo'. ¿Tener sentido? – DotNetQuestionDate

Cuestiones relacionadas