style - let in javascript w3schools
¿Influye el operador de coma en el contexto de ejecución en Javascript? (2)
var a = 1;
var b = {
a : 2,
c : function () {
console.log(this.a);
}
};
b.c(); // logs 2
(b.c)(); // logs 2
(0, b.c)(); // logs 1
El primero es comprensible, ya que "esto" se señala al objeto "b". Pero, ¿por qué el segundo registra el mismo resultado? Pensé que "esto" debería apuntarse al contexto de ejecución global. Y el tercero, parece que el operador de coma influye en el contexto de ejecución.
Consulte la llamada de evaluación indirecta , que da más detalles al respecto.
( 0 , b.c ) ( )
|____| |_____| |_____|
Literal Operator Identifier
|_________________________|
Expression
|______________________________|
PrimaryExpression
|______________________________| |________|
MemberExpression Arguments
|________________________________________________|
CallExpression
Podemos usar el operador de coma para crear una llamada indirecta a bc
que lo obligará a ejecutarse en el global context
, el valor de a
es 1
en el global context
.
También el resultado de (bc = bc)()
es 1
> (b.c = b.c)()
1
Hablando en términos de ECMAScript, esto se debe a que tanto el operador de coma (en el ejemplo
(0, bc)
) como el operador=
(en(bc = bc)
) realizan GetValue en sus operandos.
Otros formatos de llamadas indirectas como abajo
> (b.c, b.c)()
1
> (1? b.c: 0)()
1
> (__ = b.c)()
1
Realmente tienes un buen estuche de la esquina allí! Mi opinión sobre esto:
- El primero es sencillo. Sólo una llamada estándar. Los ''.'' El operador le permite llamar a la configuración de funciones
b
como el contexto de ejecución. - el segundo es exactamente lo mismo: los parámetros son totalmente opcionales y el intérprete está tratando la expresión dentro de ella como una llamada de función vinculada. En realidad no esperaba esto: pensé que el intérprete lo restablecería al objeto global, pero en realidad lo mantiene vinculado. Probablemente los usuarios del lenguaje "casual" no se asusten.
- el tercero es más estándar (al menos para aquellos que viven en JavaScript): tan pronto como su función se transmite en una expresión (en este caso por el operador), se pierde
this
valor vinculado al contexto de ejecución. Entonces, en realidad estás pasando la función en sí misma, no más vinculada al objeto declarante. Así que cuando lo llames,this
se pasará como el objeto global.
(object.function)()
esta manera: (object.function)()
se simplifica simplemente en object.function()
, porque los parens que encierran son completamente opcionales; (0, object.function)()
se analiza como (expression yielding a function)()
que va a perder la vinculación del object
a this
, porque la función ya no está vinculada.
Muy buen ejemplo!