La razón de usar un
(0, foo.fn)();
es cortar el enlace : this
ya no estará vinculado foo
sino que estará vinculado al objeto global.
Pero, ¿cuál es la razón por la cual cualquier código JavaScript (o el código JS de Google) querría cortar el enlace? (¿y es un antipatrón o no?)
javascript
nonopolaridad
fuente
fuente
bind
método vincula. Aquí es solo un cambio de contexto. No puede cortar ni perder la encuadernación (el vínculo creado porbind
).Respuestas:
Este tipo de código generalmente es generado por transpiladores (como Babel), para convertir JavaScript moderno, que utiliza las adiciones más recientes a la especificación, a una versión de JavaScript que es más compatible.
Aquí hay un ejemplo donde ocurre este patrón de transpilación:
Digamos que tenemos este código original antes de la transpilación:
Para hacer este código compatible con ES5, puede hacer esto:
Pero aquí debemos ejecutar
myfunc
conmymodule
comothis
valor, que no está ocurriendo en el código original. Y aunque eso no siempre sea un problema, es mejor asegurarse de que la función se comporte como lo haría en la versión original , incluso si esa función usara unathis
referencia: cuán inusual o incluso inútil podría ser ese uso dethis
inmyfunc
( porque también en la versión original seríaundefined
).Entonces, por ejemplo, si el código original arrojaría un error debido a una
this.memberFun()
referencia en la función, también arrojará la versión transpilada.Entonces es donde se usa el operador de coma para deshacerse de esa diferencia:
De acuerdo, en el código que escribes tú mismo, nunca tendrías un buen caso de uso para este patrón, ya que no lo usarías
this
enmyfunc
primer lugar.fuente
require
relaciona con ES6 o ES5? Solía pensar que require es un módulo de nodo.require
es, de hecho, una función disponible en el nodo o proporcionada en bibliotecas como browserify, require.js, ... etc. No está específicamente relacionado con ES5 / 6. Por otro lado, una construcción de lenguaje ES6 + comoimport
no se puede transferir a ES5 sin algo como la transpilación.modA.fn1
), entonces estas funciones realmente no deberían usarse,this
pero si por accidente lo hacen, no queremosthis
que afecte el módulo de ninguna manera como un efecto secundario, por lo que cortamos el enlace, hacemos que se comporte como debería comportarse si es una función independiente