w3schools style method entendiendo javascript this

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!