tablas - llamar javascript desde html
Llamada de funciĆ³n indirecta en JavaScript (3)
El operador de coma hace que las expresiones se evalúen secuencialmente. Al envolver las expresiones entre paréntesis, se devuelve el valor de la última expresión. Entonces (1, alert)("hello")
es funcionalmente equivalente a:
1;
alert("hello");
Fuera de mi cabeza, no puedo pensar en una razón para hacer esto.
Hay cosas como
f.call(...)
f.apply(...)
Pero luego está esto
(1, alert)(''Zomg what is this????!!!11'')
"1" no parece significar mucho en este contexto, lo siguiente funciona bien:
(null, alert)(''Zomg what is this????!!!11'')
(1, null, alert)(''Zomg what is this????!!!11'')
(undefined, alert)(''Zomg what is this????!!!11'')
¿Podría señalar una parte específica de ECMAScript que describe esa sintaxis?
Es el operador de coma , que evalúa ambos operandos y devuelve el valor del segundo.
Por lo tanto, algo así como (null, alert)
evalúa la función de alert
, que puede llamar de inmediato utilizando paréntesis.
Se describe en la sección 11.14 de ECMA-262 (PDF).
Usted acaba de usar The Comma Operator .
Este operador solo evalúa sus operandos de izquierda a derecha y devuelve el valor del segundo, por ejemplo:
(0, 1); // 1
(''foo'', ''bar''); // ''bar''
En el contexto de llamar a una función, la evaluación del operando simplemente obtendrá un valor, no una referencia, esto hace que this
valor dentro de la función invocada apunte al objeto global (o no estará undefined
en el nuevo ECMAScript 5 Strict Modo).
Por ejemplo:
var foo = ''global.foo'';
var obj = {
foo: ''obj.foo'',
method: function () {
return this.foo;
}
};
obj.method(); // "obj.foo"
(1, obj.method)(); // "global.foo"
Como puede ver, la primera llamada, que es una llamada directa, this
valor dentro del method
se referirá apropiadamente a obj
(retornando "obj.foo"
), la segunda llamada, la evaluación hecha por el operador de coma hará que this
valor para apuntar al objeto global (rindiendo "global.foo"
).
Ese patrón se ha vuelto bastante popular estos días, para hacer llamadas indirectas a eval
, esto puede ser útil bajo el modo estricto de ES5, para obtener una referencia al objeto global, por ejemplo, (imagínese que se encuentra en un entorno no explorador, window
no está disponible):
(function () {
"use strict";
var global = (function () { return this || (1,eval)("this"); })();
})();
En el código anterior, la función anónima interna se ejecutará dentro de una unidad de código de modo estricto, lo que dará como resultado que this
valor sea undefined
.
El ||
el operador ahora tomará el segundo operando, la llamada eval
, que es una llamada indirecta, y evaluará el código en el entorno global léxico y variable.
Pero personalmente, en este caso, bajo el modo estricto, prefiero usar el constructor de Function
para obtener el objeto global:
(function () {
"use strict";
var global = Function(''return this'')();
})();
Las funciones que se crean con el constructor de Function
son estrictas solo si comienzan con una directiva de uso estricto, no "heredan" la rigurosidad del contexto actual como lo hacen las declaraciones de funciones o las expresiones de funciones.