No puedo apuntarlo a las especificaciones, pero recomiendo leer Douglas Crockford's "Javascript: The good parts". Este libro lo ayudará a comprender la mayoría de las funciones extrañas pero geniales de JavaScript.
A partir de la pregunta:
- foo.bar(),
this
palabra clave en función de bar
está obligado a foo
objeto
- (foo.bar)() es el mismo que el anterior,
En javascript puede asignar variables de derecha a izquierda varias veces
z = 3; x = (y = z); console.log (x); // 3
Las funciones son variables como cualquier otra cosa. Así que está asignando la función foo.bar
a foo.bar
, pero el paréntesis hace que se devuelva la función asignada y luego se ejecuta.
(foo.bar = foo.bar)();
//is the same as
var f = (foo.bar = foo.bar);
f();
//and this also the same as:
var f= foo.bar;
f();
La función regresó de paréntesis no está obligado a nada, así this
se referirá al objeto global, en el caso de los navegadores - al objeto window
.
4 .. La cláusula (foo.bar, foo.bar)() es sólo por igual:
a = (3, 4); //last value is returned, first just parsed.
//a contains 4
var f = (foo.bar, foo.bar);
//f contains body of foo.bar function,
f() // is executed in the context of `global` object, eg. `window`.
favor, lea acerca binding
de funciones en JavaScript.
en IE parece que la salida es 20,20, undefined, undefined .. – RameshVel