¿Por qué se levanta una declaración de función dentro de un bloque de condición para el alcance de la función en Chrome pero no en Firefox?

¿Por qué los siguientes códigos generan resultados diferentes entre Chrome y Firefox?

f = function() {return true;}; 
g = function() {return false;}; 
(function() { 
   if (g() && [] == ![]) { 
      f = function f() {return false;}; 
      function g() {return true;} 
   } 
})(); 
console.log(f());

En Chrome: el resultado esfalse. Sin embargo, en Firefox, estrue.

La línea clave de los códigos anteriores es la línea 4, y basada en mi conocimiento del nombre de la función de elevación, la funcióng debe estar en la línea 6, es decir, la línea 2 está anulada por la línea 6. En mi opinión, el comportamiento de Chrome es correcto.

¿Estoy en lo cierto en esto? Si es así, ¿por qué Firefox genera resultados diferentes?

Respuestas a la pregunta(1)

Su respuesta a la pregunta