2012-08-08 30 views
7

Estoy tomando un enfoque orientado a objetos con Javascript, por dos razones. Una, porque me ayuda a aprender, y dos, solo en caso de que mi código se distribuya.Asignando 'esto' a una variable en Javascript

Ya tengo asignando funciones a variables y usando this para variables públicas. Sin embargo, estoy teniendo problemas al usar this. Cuando estoy en una función "privada", this se refiere a un alcance diferente, y no puedo acceder a las variables en this. Ilustraré mi punto.

var ClassObject = function() { 
    this.var1 = 'Hello'; 

    var var2 = 786; 

    this.func1 = function() { 
    alert(this.var1); // Alerts Hello 
    alert(var2); // Alerts 786 
    } 

    var func2 = function() { 
    alert(this.var1); // Alerts undefined 
    alert(var2); // Alerts 786 
    } 
} 

La única forma que he encontrado para dar acceso a func2this.var1 era hacer otra variable asignada a this: var c = this. ¿Es esta la mejor manera de llevar a cabo esta tarea, o incluso ampliamente aceptada? ¿Alguien puede ofrecer una mejor solución?

Gracias a todos.

+5

Respuesta corta: sí, esto es perfectamente aceptable. He visto la variable "self" utilizada para ese propósito: 'var self = this;' –

Respuesta

8

Sí, esto es una práctica aceptada. Consulte this article en el alcance o this question.

Leer en cierre también puede ser útil.

+0

Sus enlaces fueron muy útiles. Gracias. –

0

No puede hacer lo que desea a menos que use algo como establecerlo en otra variable. Entonces, reestructura todo para que no tengas que hacerlo, o simplemente usa la variable. Yo diría que es aceptable usar la variable

+0

Bueno, eso fue rápido y fácil. Gracias a todos, @Casey y TMP, y a todos los demás. –

4

El valor de this es establecido por el intérprete de JavaScript en cada llamada de función individual, incluso al llamar a sus funciones privadas. Las reglas son bastante simples:

  1. Si llama object.method(), entonces this se establece en el objeto dentro del método.
  2. Si llama a una función normal (ya sea global o local) como fn(), this se establece en el objeto global (que generalmente es window en un navegador).
  3. Al utilizar .apply() o .call(), this se establece en el primer argumento de estas funciones (por ejemplo, se puede controlar lo que se establece en por lo que se pasa a .apply() o .call().

Por lo tanto, cuando llame a su eventos privados, que van a obtener la opción 2. Si desea acceder a la this de su objeto, tienes estas tres opciones:

  1. hacer esos métodos eventos privados (que ya no serán privadas a continuación) y invocarlos como métodos li ke this.func2() por lo que el intérprete de JavaScript establece this para usted.
  2. Utilice .call() o .apply() como func2.call(this) para indicar al intérprete que configure this como lo desee.
  3. tienda el valor de this en una variable local antes de llamar func1() con algo como var self = this para que pueda referirse a self dentro func1() a través del cierre. Esto se hace con bastante frecuencia en javascript (aprovecha la forma en que los cierres permiten el acceso a las variables de ámbito primarias).
+0

Todavía no he examinado '.call()' o '.apply()', pero lo haré ahora. Gracias. –

Cuestiones relacionadas