2012-07-18 13 views
5

Sólo la comprobación de código JavaScript de Google y he encontrado esta sintaxis:sintaxis de JavaScript (0, fn) (args)

var myVar = function...; 
(0, myVar)(args); 

¿Conoce el significado de esta sintaxis? No encuentro la diferencia entre (0, myVar)(args); y myVar(args);.

Para dar un ejemplo exacto, tenemos

_.x3 = function (a, b) { 
    return new _.q3(20 * b.x + a.B.B.x, 20 * b.y + a.B.B.y) 
}; 

Y más tarde

this.ta = new _.s3((0, _.x3)(this.fa, this.B.B), 0); 
+0

posible duplicado de [javascript coma operador] (http://stackoverflow.com/questions/5580596/javascript-comma-operator) –

+0

Fuera de curiosidad, puede publicar más de la contexto de donde aparece esto? – Austin

+0

Estaba comprobando el código de https://www.google.fr/xjs/_/js/s/sy46,zr/rt=j/ver=-wnZQEUYm8E.en_US./d=0/rs=AItRSTNMBUOhWluxPqsKFY9CVTnMlxNz6w – korko

Respuesta

0

El operador de coma devuelve el valor del último operando, por lo que el valor de 0, myVar es el mismo que el valor de myVar. El valor del primer operando se evalúa, pero en este caso, por supuesto, no logra nada.

El operador coma se utiliza a veces, cuando el primer operando realmente hace algo, como la inicialización de dos variables en un bucle:

for (i = 0, j = 42; i < 10; i++, j--) ... 
+0

Sí, lo sé, pero la razón es, en realidad, ¿cuál es el interés de esto (0, fn)? Si sabes algo? Tal vez sea solo un marcador de posición para casos específicos, pero no creo que Google agregue caracteres inútiles en sus js. – korko

+1

@korko: No existe una razón práctica para esa construcción, por lo que es un malentendido o un intento de ofuscación del código. – Guffa

+0

No creo que Google esté malinterpretando javascript: D Por lo tanto, tal vez se ofusque pero no creo que tampoco, solo agrega algunos caracteres mientras que Google siempre trata de eliminar los caracteres inútiles para reducir el tamaño del archivo. – korko

3

Esta sintaxis se utiliza el operador coma, ,. Evalúa todos sus operandos y devuelve el valor de la última. En este caso, 0 solo se está utilizando como marcador de posición por lo que (0, function() {}) devolverá (function() {}). Después de que se evalúa, la parte (args) invoca la función y le da sus argumentos.

Edición después de comentario:

La razón se podría usar este estilo de codificación es para que puedan ejecutar el código de forma rápida o en una línea. Aquí está un ejemplo:

var a = 0, 
    b = 1, 
    c; 

c = (a++, b++, a + 2); // a is added, b is added, and a is added then returned 

a; // 1 
b; // 2 
c; // 3 
+0

Sí, es absolutamente una buena razón, pero ... 0 no significa nada. ¿Hay algún tipo de protección, descobertura o algo que dé significado a (0, fn)() en lugar de simplemente fn(). – korko

+0

Lo siento, pero no se me ocurre ninguno. Sin embargo, estoy seguro de que hay un motivo por el cual Google lo está usando. – 0x499602D2

+0

De todos modos, gracias por su respuesta, es bueno saber;) – korko

1

que tenía la misma pregunta y luego encontré la respuesta, de la siguiente manera:

Realmente es para

(0, foo.fn)(); 

Hay que recordar que en JavaScript, cuando se invoca foo.fn() , entonces dentro de fn, el this está obligado a foo. Si utiliza

var g = foo.fn; 
g(); 

a continuación, cuando se invoca g anterior, el this está ligado al objeto global (window, en el contexto de un navegador web).

¿Entonces necesita definir g como arriba? ¿Puede hacer algo como

(foo.fn)(); 

La respuesta es no. JavaScript lo tratará igual que foo.fn();, ya que es solo foo.fn con el () redundante que se puede eliminar.

Pero hay una manera de moverse es, y es exactamente a utilizar the comma operator, which Mozilla stated as

El operador coma evalúa cada uno de sus operandos (de izquierda a derecha) y devuelve el valor del último operando

Así, utilizando

(0, foo.fn)(); 

la (0, foo.fn) obtendrá evaluado con una referencia a la función, lik e g arriba, y luego se invoca la función. Y luego, this no está vinculado a foo, sino que está vinculado al objeto global.

Así que el código escrito de esta manera, es "cortar el enlace".

Ejemplo:

var foo = { 
       fullName: "Peter", 
       sayName: function() { console.log("My name is", this.fullName); } 
      }; 

window.fullName = "Shiny"; 

foo.sayName();  // My name is Peter 

(foo.sayName)();  // My name is Peter 

(0, foo.sayName)(); // My name is Shiny 
Cuestiones relacionadas