Это происходит из-за отсутствия Firefox функции подъема, как задумано в ECMAScript 5.
Хром правильно присваивает значение F() перед запуском тело функции, поэтому первый вариант F() перезаписывается вторым.
SpiderMonkey (двигатель JavaScript браузера Firefox) запускает код без предварительного assignin значения для F(), поэтому он использует единственное значение, которое встречает на своем пути: function f() { alert("yes"); };
то, что функция подъем?
Область действия функции JavaScript означает, что все переменные, объявленные внутри функции, видны по всему телу функции. Любопытно, что это означает, что переменные равно , видимым до их объявления. Эта особенность JavaScript неофициально известна под названием hoisting: Код JavaScript ведет себя так, как будто все объявления переменных в функции (но не любые связанные назначения) «поднимаются» вверху функции.
источники:
http://statichtml.com/2011/spidermonkey-function-hoisting.html
2011 - O'Reilly - JavaScript - полное руководство шестых издание