2010-01-29 12 views
5

Básicamente, estoy tratando de comprender y aprender el principio de funcionamiento de la palabra clave "this" en JavaScript.'esta' palabra clave se refiere a qué objeto dentro de una función dentro de otra función?

Por lo que entiendo 'esto' se refiere al objeto (función) que está dentro de ese momento.

Así, por creer esto, yo quería poner a prueba la salida de la simple código de abajo:

<body> 

<input type="button" value="Add Age" onclick="Outer()" /> 

<script type="text/javascript"> 

function Outer(){ 

if(typeof this.Father == 'undefined') 
    { 
     this.Father = 0; 
    } 

this.Father+=2; 
alert(this.Father); 

inner(); 

     function inner(){ 
      if(typeof this.Son== 'undefined') 
      { 
       this.Son = 0; 
      }; 

      this.Son++; 
      alert(this.Son); 
      alert(this.Father); 
     }; 
}; 
</script> 
</body> 

y su salida me confunde. Porque en la función inner(), this.Son emite el valor entero incrementado de Son. Pero espero esto. Padre falla porque inner() no tiene un atributo .Father. Pero en lugar de lanzar una excepción que alerta al valor de this.Father -¿Cuál parece

  • una línea por encima se refiere esto interior()
  • y siguiendo la línea se refiere esto externo (la)

en este punto tengo 2 preguntas en mi mente podía comprender:

  1. ¿el 'esto' se refiere siempre a la palabra clave la carcasa externa del alcance incluso dentro de las funciones internas?

  2. Y sin tener ninguna instancia declarada 'esta' palabra clave ¿qué hace referencia al método? (Me refiero a algo sin tener lik var myFamily = new Outer())

Gracias,

Ozdogan Burak

Respuesta

5

this está determinado por el patrón de invocación, es decir, la forma en que se está llamando un objeto función.

Hay 4 tipos diferentes de patrones de invocación:

  1. invocación de método: la función se define como una propiedad de un objeto, y se llama a través del objeto utilizando el refinamiento, es decir, ..

    a.func(); // this se refiere al objeto, es decir, a.

  2. invocación de función: llamada de función simple.

    func(); // this está vinculado al objeto global.

  3. invocación de constuctor: bueno, es un poco complicado. Como los constructores se usan como, bueno, el método consturctor para los nuevos objetos de función que son new, this se refiere al nuevo objeto de función que se está creando.

    var func = new Func(); // this refiere a func mientras que en Func constructor)

  4. aplican invocación:

    func.apply (thisArg, argArray); // this es un enlace al primer argumento

En otras palabras, el this en su ejemplo se refiere a todo el objeto global (su onClick llamada Other()). Deberías intentar usar new Other() en su lugar.

+0

Gracias, es información realmente útil. puede encontrar algo más acerca de los patrones de invocación en este artículo: http://mcarthurgfx.com/blog/article/4-ways-functions-mess-with-this – pencilCake

+0

Y este también es bastante explicativo: Invocación de función en JavaScript - contextos revisitados - http://msmvps.com/blogs/luisabreu/archive/2009/08/24/function-invocation-in-javascript-contexts-revisited.aspx – pencilCake

Cuestiones relacionadas