if 文の中で関数定義
- カテゴリ:
- JavaScript
- ブラウザ
- コメント数:
- Comments: 0
◆ 関数定義のスコープは Firefox と Chrome で違う
function 構文を使うと var と同じくスコープの最初で定義されます
また let ができるまで JavaScript は関数スコープでブロックスコープは無意味です
ということから if 文内の宣言は if の条件式が true でも false でも関係なく宣言はされると思ってました
こんなコードを用意しました
Chrome では
Firefox だと
またかよ おまえら
let も "use strict" なしで書けます
もしかして let に合わせてブロックスコープに変化したのかな?
考えてみれば そんあこれまでのコードを壊す変更はしなさそうです
関数と関数スコープ#条件付きで関数を定義する
ブラウザで一貫してないらしいです
条件付きにしたい場合は こうすればいいですし 特に困らないといえば困らないです
わかりやすく行ごとにソース要素である/ない が書かれてます
え? そうなの
関数式だったら 即時実行や 無名関数にできるよねっとやってみたら
エラーじゃん
Chrome 明らかに構文扱いしてるから別として MDN にリファレンス書いておいて Firefox がエラーってどういうことですか
同じページの 「関数式」 の説明にちゃんと名前は省略できるって書いてるのに
でもエラーメッセージが「関数構文」には名前が必要って言ってるような気がするので 関数式じゃないんでしょうね
また let ができるまで JavaScript は関数スコープでブロックスコープは無意味です
ということから if 文内の宣言は if の条件式が true でも false でも関係なく宣言はされると思ってました
ブラウザで違う
var x = false
if(x){
function fn(){}
}
console.log(window.fn)
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)
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
function (){}
}
SyntaxError: function statement requires a name
if(0){
function a(){}()
}
SyntaxError: expected expression, got ')'
function a(){}()
}
SyntaxError: expected expression, got ')'
エラーじゃん
Chrome 明らかに構文扱いしてるから別として MDN にリファレンス書いておいて Firefox がエラーってどういうことですか
同じページの 「関数式」 の説明にちゃんと名前は省略できるって書いてるのに
でもエラーメッセージが「関数構文」には名前が必要って言ってるような気がするので 関数式じゃないんでしょうね