##JavaScriptのブロックスコープに関する問題を解いてみた
###問題
* 問題:
* 以下のコードではエラーが発生します。
* コンソールで"fn called"と表示されるように
* fn内のコードを変更してください。
*
* ※if文は削除してはいけません。
*/
function fn() {
if(true) {
let a = 'fn called';
}
return a; // ReferenceError: a is not defined
}
const result = fn();
console.log(result);
解答
ifの中でletを使って変数定義している為、ブロックスコープが有効になり、ブロックスコープの外で、return a; のようにaを呼び出そうとしてもReferenceError: a is not definedのようなエラーが出てしまう!
よって、ブロックスコープの外に変数宣言を持っていくことでエラーを解消することができる!!
function fn() {
let a;
if(true) {
a = 'fn called';
}
return a;
}
const result = fn();
console.log(result);
このようにしてあげることによって、return a; とlet a;が同じスコープ内にあることからa; を呼び出すことができる!
ちなみに、let a = 'fn called'; を var a = 'fn called';にすることで、varはブロックスコープを無視することより、aを取得することはできるが、varは非推奨とのことだったので、上記のような方法でa;を取得しました!