2011-12-29 10 views
18

¿Alguien me puede explicar por qué A es verdadero y B es falso? Hubiera esperado que B también fuera verdad.este valor en la función anónima de JavaScript

function MyObject() { 

}; 

MyObject.prototype.test = function() { 
    console.log("A", this instanceof MyObject); 
    (function() { 
     console.log("B", this instanceof MyObject); 
    }()); 
} 

new MyObject().test(); 
+5

Bienvenido al alcance funcional en JavaScript. – zzzzBov

+1

@zzzzBov: Eso no es un cierre. – SLaks

+0

Es posible que desee utilizar un par adicional de parens para mejorar la legibilidad: '(new MyObject()) .test()' –

Respuesta

15

this es especial.Se refiere al objeto por el que se llama a la función en nombre de (comúnmente a través de sintaxis de punto).

Por lo tanto, en el caso de A, se llama a la función en nombre de un nuevo objeto MyObject. B está en una función diferente que no se llama explícitamente en nombre de ningún objeto, por lo que this se establece de forma predeterminada en el objeto global (window).

En otras palabras, this cambia dependiendo de cómo la función es llamada, no dónde ni cómo se define. El hecho de que esté utilizando una función anónima (definida dentro de otra función) es una coincidencia y no tiene ningún efecto sobre el valor de this.

+4

Su afirmación" 'this' cambia dependiendo de cómo la función es * llamada *, no donde o cómo se define ", puede ser engañoso.De hecho, 'this' es simplemente el propietario de la función llamada, y eso, en sí mismo, siempre está explícitamente definido o por defecto en el objeto global. 'myVar.doSomething = doSomething;' define la función 'myVar.doSomething' como' doSomething' donde 'this' siempre se referirá a' myVar' al llamar 'myVar.doSomething()', independientemente de dónde 'myVar.doSomething() 'se llama desde. Su declaración podría sugerir lo contrario. – Navigateur

3

se establece en función de cómo llame a la función.
Su función anónima es una llamada a función normal, por lo que this es el objeto global.

Puede escribir (function() { ... }).call(this) para llamarlo explícitamente con su this.

+0

Bueno, estoy asumiendo el modo estricto, entonces ... ':)' –

+0

@ ŠimeVidas: ¿Qué? – SLaks

+0

... así que 'this' is' undefined'. –

26

Dentro de su función anónima this es el objeto global.

Dentro de test, esta es la instancia de MyObject en la que se invocó el método.


Cada vez que se llama a una función como esta:

somceFunction(); // called function invocation 

this es siempre el objeto global, o undefined en modo estricto (a menos someFunction fue creado con bind** - véase más adelante)

Siempre que llame a una función como esta

foo.someMethod(); //called method invocation 

this se establece en foo


** ECMAScript5 define una función bind que le permite crear una función que tiene un valor pre-establecido para this

Así que este

var obj = { a: 12 }; 
    var someFunction = (function() { alert(this.a); }).bind(obj); 
    someFunction(); 

Causas someFucntion a ser invocados con this igual a obj y alertas 12. Menciono esto sólo para en cuenta que esta es una posible excepción a la regla que he mencionado acerca de las funciones invocadas como

someFunction(); 

teniendo siempre igual a this el objeto global (o undefined en modo estricto)

+0

La línea '(función() {alerta (this.a);}). Bind (obj)' es exactamente lo que estaba buscando - contexto vinculante para una función anónima. Funciona perfectamente, +1 –

+0

También puede establecer el 'this' utilizando' func.call (this, arg1, arg2 ..) ' – Omu

6

en la función anónima, this se une al objeto global (window en un entorno de navegador).

Hay varias formas de acceder a la instancia:

var self = this; 
(function() { 
    console.log("B", self instanceof MyObject); 
}()); 

o

(function() { 
    console.log("B", this instanceof MyObject); 
}).call(this); 
Cuestiones relacionadas