◆ 関数定義のスコープは Firefox と Chrome で違う

function 構文を使うと var と同じくスコープの最初で定義されます
また let ができるまで JavaScript は関数スコープでブロックスコープは無意味です

ということから if 文内の宣言は if の条件式が true でも false でも関係なく宣言はされると思ってました

ブラウザで違う

var x = false
if(x){
function fn(){}
}
console.log(window.fn)

こんなコードを用意しました

Chrome では
function fn(){}
定義されています

Firefox だと
undefined
定義されていません

またかよ おまえら

let スコープ?

今のところ ES6 の対応は Firefox のほうが進んでます
let も "use strict" なしで書けます

もしかして let に合わせてブロックスコープに変化したのかな?
var x = true
if(x){
function fn(){}
}
console.log(window.fn)
function fn()
あれ スコープ出てもみれてますね

考えてみれば そんあこれまでのコードを壊す変更はしなさそうです

元からだったみたい

MDN をぐぐってみるとこんなものが

関数と関数スコープ#条件付きで関数を定義する
関数は //function 文// (ECMA-262 Edition 3 標準の許可された拡張) か Function コンストラクタを使って条件付きで定義することができます。function 文は ES5 の strict モードで許可されないといったことに注意してください。加えて、この機能はブラウザ間で一貫して動作していませんので頼るべきではありません。

ブラウザで一貫してないらしいです

条件付きにしたい場合は こうすればいいですし 特に困らないといえば困らないです
var fn = function (){}

ブロックスコープの関数構文は関数式?

そのページの少し上のほうをみてると 「if や while などの関数以外のブロックの中に書かれた関数宣言は関数式になる」そうです
わかりやすく行ごとにソース要素である/ない が書かれてます

え? そうなの

関数式だったら 即時実行や 無名関数にできるよねっとやってみたら
if(0){
function (){}
}
SyntaxError: function statement requires a name
if(0){
function a(){}()
}
SyntaxError: expected expression, got ')'

エラーじゃん

Chrome 明らかに構文扱いしてるから別として MDN にリファレンス書いておいて Firefox がエラーってどういうことですか
同じページの 「関数式」 の説明にちゃんと名前は省略できるって書いてるのに

でもエラーメッセージが「関数構文」には名前が必要って言ってるような気がするので 関数式じゃないんでしょうね