La razón de usar un
(0, foo.fn)();
es cortar el enlace : thisya no estará vinculado foosino 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

bindmé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
myfuncconmymodulecomothisvalor, 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 unathisreferencia: cuán inusual o incluso inútil podría ser ese uso dethisinmyfunc( 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
thisenmyfuncprimer lugar.fuente
requirerelaciona con ES6 o ES5? Solía pensar que require es un módulo de nodo.requirees, 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 + comoimportno se puede transferir a ES5 sin algo como la transpilación.modA.fn1), entonces estas funciones realmente no deberían usarse,thispero si por accidente lo hacen, no queremosthisque 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