2012-03-16 7 views
10

Mientras investiga guiones PlusOne Google, he visto muchas veces siguiente sintaxis:¿Cuál es el motivo para usar dicha sintaxis (0, _.Em)();

(0, _.Em)(); 

Suponiendo _.Em es una función de la declaración anterior se traduciría en llamar a esa función, que es bastante obvio. Si, por otro lado, no estaría definido, ¿no sería el resultado lo mismo que hacer simplemente _.Em()?

¿Alguien puede arrojar luz sobre cuál es la idea detrás de usar tal sintaxis?

+0

ver también [¿El operador de coma influye en el contexto de ejecución en Javascript?] (Http://stackoverflow.com/q/36076794/1048572) – Bergi

Respuesta

8

Básicamente, esta sintaxis permite llamar a _.Em() en el contexto del objeto window en lugar de _.

Asumiendo que tienen este código:

Foo = function() { 
    this.foo = "foo"; 
}; 

Foo.prototype.Em = function() { 
    alert(this.foo); 
}; 

var _ = new Foo(); 

emisión _.Em() dará lugar a Em() ser llamado en el contexto de _. Dentro de la función, la palabra clave this se referirá a _, por lo que se imprimirá foo.

Emitir (0, _.Em)() desacopla la llamada al método del objeto y realiza la llamada en el contexto global. Dentro de la función, la palabra clave this se referirá a window, por lo que se imprimirá undefined, ya que window no tiene una propiedad foo.

Puede probar la diferencia entre las dos sintaxis en this fiddle.

+0

Pero ¿por qué '(0, _.EM)()' funciona como ¿ese? – Niko

+5

Como evaluar '_.Em', aplicar el operador de llamada no es lo mismo que llamar' _.Em() 'directamente. Evaluar '_.Em' de forma independiente devuelve una" función libre ", por falta de un término mejor, y esa función ya no estará ligada al objeto' _'. El mismo resultado puede obtenerse escribiendo 'var f = _.Em; f(); '. En ambos casos, la palabra clave 'this' se referirá a' window' en lugar de '_' dentro de la función. –

+0

+1, buena respuesta. Me gustaría añadir que esta es quizás la forma más absurda de azúcar sintáctico que he visto en JS. '(0,)()' es exactamente la misma longitud que '.call()', por lo que no hay ningún byte guardado a menos que elimine el espacio después de la coma (y aun así solo es uno). A costa de confundir a los desarrolladores desprevenidos, realmente no parece valer la pena utilizar una sintaxis como esta. –

Cuestiones relacionadas